在场景中的几何形体被初始化之后,就可以渲染场景了。为了渲染一个带有纹理的物体,该纹理必须被选为当前纹理。下一步则是要设置阶段的纹理状态值。纹理状态可以让你定义纹理需要怎样渲染。例如,你可以将多种纹理混合在一起。
Texture示例工程开始时将纹理设为启用。下面的代码段调用IDirect3DDevice9::SetTexture来设置纹理,并通知Direct3D设备渲染时使用此纹理。
g_pd3dDevice->SetTexture( 0, g_pTexture );
第一个参数是阶段标识符,它指明在哪个阶段设置纹理。一个设备最多可以设置8个阶段,所以这个数字最大为7。Texture示例工程仅有一个纹理,在这里把它放到阶段0。第二个参数是指向纹理对象的指针。Texture示例工程使用在InitGeometry函数中创建的纹理对象。
下面的代码通过调用IDirect3DDevice9::SetTextureStageState方法来设置纹理的状态值。
// Setup texture. Using textures introduces the texture stage states, which
// govern how textures get blended together (in the case of multiple
// textures) and lighting information. In this case, you are modulating
// (blending) your texture with the diffuse color of the vertices.
g_pd3dDevice->SetTexture( 0, g_pTexture );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
#ifdef SHOW_HOW_TO_USE_TCI
// Note: To use Direct3D texture coordinate generation, use the stage state
// D3DTSS_TEXCOORDINDEX, as shown below. In this example, you are using
// the position of the vertex in camera space to generate texture
// coordinates. The tex coord index (TCI) parameters are passed into a
// texture transform, which is a 4x4 matrix that transforms the x,y,z
// TCI coordinates into tu, tv texture coordinates.
// In this example, the texture matrix is set up to
// transform the texture from (-1,+1) position coordinates to (0,1)
// texture coordinate space:
// tu = 0.5*x + 0.5
// tv = -0.5*y + 0.5
D3DXMATRIXA16 mat;
mat._11 = 0.25f; mat._12 = 0.00f; mat._13 = 0.00f; mat._14 = 0.00f;
mat._21 = 0.00f; mat._22 =-0.25f; mat._23 = 0.00f; mat._24 = 0.00f;
mat._31 = 0.00f; mat._32 = 0.00f; mat._33 = 1.00f; mat._34 = 0.00f;
mat._41 = 0.50f; mat._42 = 0.50f; mat._43 = 0.00f; mat._44 = 1.00f;
g_pd3dDevice->SetTransform( D3DTS_TEXTURE0, &mat );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_COUNT2 );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX,
D3DTSS_TCI_CAMERASPACEPOSITION );
#endif
IDirect3DDevice9::SetTextureStageState接受的第一个参数是一个阶段索引(Stage Index),它用来标识需要设置的变量。这里需要改变在阶段0的纹理,所以填0。下一个参数则是需要设置的纹理状态。如果想知道所有可用的纹理状态,可以搜索D3DTEXTURESTAGESTATETYPE的相关信息。下一个参数是需要改变的纹理状态值。这个值取决于在前面设置的纹理状态。
在为每个阶段的纹理状态设置了适当的值之后,圆柱体就可以被渲染了。此时,纹理也会被贴在圆柱体的表面。
使用纹理坐标的另一种方法是可以让它们自动生成。这是通过使用纹理坐标索引(TCI)实现的。TCI使用一个纹理矩阵,它将TCI坐标(x,y,z)转化为纹理坐标(tu,tv)。在这个示例中,是使用摄像机空间向量的位置来生成纹理坐标的。
第一步是创建一个变换矩阵,如下所示:
D3DXMATRIX mat;
mat._11 = 0.25f; mat._12 = 0.00f; mat._13 = 0.00f; mat._14 = 0.00f;
mat._21 = 0.00f; mat._22 =-0.25f; mat._23 = 0.00f; mat._24 = 0.00f;
mat._31 = 0.00f; mat._32 = 0.00f; mat._33 = 1.00f; mat._34 = 0.00f;
mat._41 = 0.50f; mat._42 = 0.50f; mat._43 = 0.00f; mat._44 = 1.00f;
矩阵创建之后,必须通过调用IDirect3DDevice9::SetTransform来设置它。
g_pd3dDevice->SetTransform( D3DTS_TEXTURE0, &mat );
D3DTS_TEXTURE0标志位告诉Direct3D将变换应用到在阶段0的纹理上。下一步则是设置更多所需要的纹理状态值。如下所示:
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_COUNT2 );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX,
D3DTSS_TCI_CAMERASPACEPOSITION );
纹理坐标已将建立,现在就可以渲染场景了。注意,对于圆柱体来说,坐标是自动创建的。这将使得在几何形体渲染完成之后,纹理才会覆盖到渲染屏幕上。
本指南向你展示了如何在表面上添加纹理。指南6:使用Meshes 将向你展示如何使用更复杂的几何形体。