Calculates per-triangle IMT's from a texture mapped onto a mesh, to be used as input to UVAtlasCreate or UVAtlasPartition.

HRESULT UVAtlasComputeIMTFromTexture(
    _In_reads_(nVerts) const XMFLOAT3* positions,
    _In_reads_(nVerts) const XMFLOAT2* texcoords,
    _In_ size_t nVerts,
    _When_(indexFormat == DXGI_FORMAT_R16_UINT,
    _When_(indexFormat != DXGI_FORMAT_R16_UINT,
        _In_reads_bytes_(nFaces*sizeof(uint32_t))) const void* indices,
    _In_ DXGI_FORMAT indexFormat, _In_ size_t nFaces,
    _In_reads_(width*height*4) const float* pTexture,
    _In_ size_t width, _In_ size_t height,
    _In_ DWORD options,
    _In_opt_ std::function<HRESULT(float percentComplete)> statusCallBack,
    _Out_writes_(nFaces * 3) float* pIMTArray);


pTexture: A float array of width * height * 4 in size. This data should be in DXGI_FORMAT_R32G32B32A32_FLOAT format. You can use DirectXTex functions to convert arbitrary format textures to this form.

options: A combination of UVATLAS_IMT flags
  • UVATLAS_IMT_DEFAULT - The default is no wrapping in either U or V.
  • UVATLAS_IMT_WRAP_U - Wrap in the U dimension
  • UVATLAS_IMT_WRAP_V - Wrap in the V dimension
  • UVATLAS_IMT_WRAP_UV - Wrap in both the U and V dimensions.
pIMTArray: The resulting IMT data which is passed to UVAtlasCreate or UVAtlasPack which is an array of 3 float values per face.


Given a texture that maps over the surface of the mesh, the algorithm computes the IMT for each face. This will cause triangles containing lower-frequency signal data to take up less space in the final texture atlas when parameterized with the UVAtlas functions. The texture is assumed to be interpolated over the mesh bilinearly.

Last edited Oct 31, 2014 at 6:38 PM by walbourn, version 7