http://blog.csdn.net/loveclover

第三步:渲染场景

在场景中的几何形体被初始化之后,就可以渲染场景了。为了渲染一个带有纹理的物体,该纹理必须被选为当前纹理。下一步则是要设置阶段的纹理状态值。纹理状态可以让你定义纹理需要怎样渲染。例如,你可以将多种纹理混合在一起。

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 将向你展示如何使用更复杂的几何形体。

posted on 2008-03-19 11:49 Sure 阅读(674) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

常用链接

留言簿(5)

随笔分类

随笔档案

相册

搜索

最新评论

阅读排行榜

评论排行榜