纹理坐标转换 (Direct3D 9)

Direct3D 设备可以通过应用 4x4 矩阵来转换顶点的纹理坐标。 系统以与几何图形相同的方式将转换应用于纹理坐标。 任何转换(刻度、旋转、转换、投影、剪切或这些转换的任意组合)都可以使用 4x4 矩阵完成。

注意

Direct3D 不会修改转换的顶点和点。 因此,使用转换和点亮顶点的应用程序无法使用 Direct3D 来转换顶点的纹理坐标。

 

支持硬件加速转换和照明作的设备(T&L HAL 设备)也加速纹理坐标的转换。 当转换的硬件加速不可用时,Direct3D 几何管道中的特定于平台的优化适用于纹理坐标转换。

纹理坐标转换可用于产生特殊效果,同时避免需要直接修改几何图形的纹理坐标。 可以使用简单的翻译或旋转矩阵对对象上的纹理进行动画处理,也可以转换 Direct3D 自动生成的纹理坐标,以简化和加速高级效果,例如投影纹理和动态光映射。 此外,还可以使用纹理坐标转换在多个纹理阶段中重复使用单个纹理坐标集以实现多个目的。

设置和检索纹理坐标转换

与应用程序用于几何图形的矩阵一样,通过调用 IDirect3DDevice9::SetTransformIDirect3DDevice9::GetTransform 方法来设置和检索纹理坐标转换。 这些方法通过 D3DTRANSFORMSTATETYPE 枚举类型的D3DTS_TEXTURE7成员接受D3DTS_TEXTURE0,以分别标识纹理阶段 0 到 7 的转换矩阵。

以下代码设置一个矩阵,用于应用于纹理阶段 0 的纹理坐标。

// For this example, assume the d3dDevice variable contains a 
//   valid pointer to an IDirect3DDevice9 interface.

D3DMATRIX matTrans = D3DXMatrixIdentity( NULL );

// Set up the matrix for the desired transformation.
d3dDevice->SetTransform( D3DTS_TEXTURE0, &matTrans );

启用纹理坐标转换

D3DTSS_TEXTURETRANSFORMFLAGS纹理阶段状态控制纹理坐标转换的应用。 此纹理阶段状态的值由 D3DTEXTURETRANSFORMFLAGS 枚举类型定义。

当D3DTSS_TEXTURETRANSFORMFLAGS设置为D3DTTFF_DISABLE(默认值)时,将禁用纹理坐标转换。 假设为阶段 0 启用了纹理坐标转换,以下代码将禁用它们。

// For this example, assume the d3dDevice variable contains a 
// valid pointer to an IDirect3DDevice9 interface.

d3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, 
                                 D3DTTFF_DISABLE );

D3DTEXTURETRANSFORMFLAGS 中定义的其他值用于启用纹理坐标转换,并控制将生成的纹理坐标元素传递给光栅器有多少个。 例如,使用以下代码。

// For this example, assume the d3dDevice variable contains a 
//   valid pointer to an IDirect3DDevice9 interface.

d3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, 
                                 D3DTTFF_COUNT2 );

D3DTTFF_COUNT2值指示系统为纹理阶段 0 应用转换矩阵集,然后将修改后的纹理坐标的前两个元素传递给光栅器。

D3DTTFF_PROJECTED纹理转换标志指示投影纹理的坐标。 指定此标志后,光栅器会将传入的元素除以最后一个元素。 以以下代码为例。

// For this example, assume the d3dDevice variable contains a 
//   valid pointer to an IDirect3DDevice9 interface.

d3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, 
                                 D3DTTFF_COUNT3 | D3DTTFF_PROJECTED );

此示例通知系统将三个纹理坐标元素传递给光栅器。 光栅器将前两个元素除以第三个元素,生成处理纹理所需的 2D 纹理坐标。

纹理坐标处理