(Direct3D 9) 纹理坐标转换

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

注意

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

 

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

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

设置和检索纹理坐标转换

与应用程序用于几何图形的矩阵一样,可以通过调用 IDirect3DDevice9::SetTransform 和 IDirect3DDevice9::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 纹理坐标。

纹理坐标处理