Skip to content

ComputeNormalMap

Chuck Walbourn edited this page Apr 5, 2022 · 7 revisions
DirectXTex

Converts a height-map to a normal-map.

HRESULT ComputeNormalMap(
    const Image& srcImage, CNMAP_FLAGS flags,
    float amplitude, DXGI_FORMAT format,
    ScratchImage& normalMap );

HRESULT ComputeNormalMap(
    const Image* srcImages, size_t nimages,
    const TexMetadata& metadata,
    CNMAP_FLAGS flags, float amplitude, DXGI_FORMAT format,
    ScratchImage& normalMaps );

Parameters

flags: a combination of the following flags

  • CNMAP_DEFAULT Default flags

Selects which channel to use as the height. Luminance is a monochrome value computed from R, G, and B using classic scaling (R*0.2125 + G*0.7154 + B*0.0721).

  • CNMAP_CHANNEL_RED
  • CNMAP_CHANNEL_GREEN
  • CNMAP_CHANNEL_BLUE
  • CNMAP_CHANNEL_ALPHA
  • CNMAP_CHANNEL_LUMINANCE

Selects mirroring semantics for scanline references. Otherwise defaults to wrap.

  • CNMAP_MIRROR_U

  • CNMAP_MIRROR_V

  • CNMAP_MIRROR Same as both CNMAP_MIRROR_U and CNMAP_MIRROR_V

  • CNMAP_INVERT_SIGN Inverts the sign of the computed normal vector

  • CNMAP_COMPUTE_OCCLUSION Computes a crude occlusion term and stores in the resulting alpha channel

amplitude: Scaling factor for normals

format: Format of the resulting ScratchImage

Example

ScratchImage hmapImage;

...

ScratchImage normalMap;
hr = ComputeNormalMap( hmapImage.GetImage(0,0,0),
    CNMAP_CHANNEL_LUMINANCE | CNMAP_COMPUTE_OCCLUSION,
    2.f, DXGI_FORMAT_R8G8B8A8_UNORM, normalMap );
if ( FAILED(hr) )
    ...

Remarks

This function does not operate directly on block compressed images. See Decompress and Compress.

This function cannot operate directly on a planar format image. See ConvertToSinglePlane for a method for converting planar data to a format that is supported by this routine.

This method computes the normal by using the central difference with a kernel size of 3x3. The central differencing denominator used is 2.0. RGB channels in the destination contain biased (x,y,z) components of the normal.