Converts a height-map to a normal-map.

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

HRESULT ComputeNormalMap( _In_reads_(nimages) const Image* srcImages,
    _In_ size_t nimages,
    _In_ const TexMetadata& metadata,
    _In_ DWORD flags, _In_ float amplitude, _In_ DXGI_FORMAT format,
    _Out_ 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.
  • 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.

Last edited Jun 22, 2015 at 6:08 AM by walbourn, version 5