概述:
对于一些特殊的纹理应用需要对纹理坐标进行处理,主要包括纹理坐标自动生成和纹理坐标变换。
纹理坐标的来源:来自FVF 和 来自Direct3D
在纹理坐标到达光栅处理器之前,决定是否启用纹理坐标变换。
一、 纹理坐标自动生成
可以通过Direct3D渲染引擎自动生成纹理坐标,用于诸如环境映射等特殊的视觉效果。纹理坐标自动生成在Direct3D坐标变换和光照流水线中完成,执行速度更快。
Direct3D系统可以使用经过变换的空间顶点位置坐标、法线信息来生成纹理坐标。
纹理坐标自动生成主要是用于产生出一些特殊效果。
通过D3DTSS_TEXCOORDINDEX纹理阶段状态可控制Direct3D系统如何自动生成纹理坐标。坐标生成标志:
D3DTSS_TCI_PASSTHRU 使用顶点信息中的纹理坐标
D3DTSS_TCI_CAMERASPACENORMAL 以顶点在观察坐标系中的法线向量作为该纹理层的纹理坐标输出
D3DTSS_TCI_CAMERASPACEPOSITION 一顶点在观察坐标系中的顶点坐标作为该纹理层的纹理坐标输出
D3DTSS_TCI_REFLECTIONVECTOR 以顶点在观察坐标系中的反射向量作为该纹理层的纹理坐标输出,反射向量由顶点坐标和法线向量计算得出
D3DTSS_TCI_SPHEREMAP 输出球面反射的纹理坐标
pd3dDevice->SetTextureStageState(0,D3DTSS_TEXTURECOORDINDEX, D3DTSS_TCI_CAMERASPACENORMAL );
纹理阶段状态D3DTSS_TEXTURETRANSFORMFLAGS 用来控制纹理坐标生成的输出。
pd3dDevice->SetTextureStageState(0,D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 );
二、 纹理坐标变换
Direct3D提供了对生成的纹理坐标进行坐标变换的功能。可以指定一个4*4的纹理坐标变换矩阵,把他与生成的纹理坐标相乘,然后将变换之后的纹理坐标输出至Direct3D渲染流水线。
下面的代码将原来的纹理坐标平移(1.0,1.0,0.0)
D3DXMATRIX mat;
D3DXMatrixIdentity(&mat);
mat.41 = 1.0f;
mat.42 = 1.0f;
mat.43 = 0.0f;
pd3dDevice->SetTransform( D3DTEXTURE0, mat);