素材如下:
spotlite.JPG
WallTexture.JPG
课堂练习:
利用素材wallTexture.bmp和spotlite.bmp进行光照贴图
在sample中的三角形程序Vertices.cpp进行修改,并添加以下部分。
1、加头文件
#include <d3dx9.h>
2、初始化
LPDIRECT3DTEXTURE9 g_pTexture0=NULL;
LPDIRECT3DTEXTURE9 g_pTexture1=NULL;
3、定义正方形的坐标及两个图片的UV坐标
struct CUSTOMVERTEX
{
FLOAT x, y, z, rhw; // The transformed position for the vertex
FLOAT u1,v1;
FLOAT u2,v2; // The vertex color
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_TEX2)
4、创建纹理
if( FAILED( D3DXCreateTextureFromFile(g_pd3dDevice,"WallTexture.bmp",&g_pTexture0)))
{
MessageBox(NULL,"创建纹理失败","WallTexture.exe",MB_OK);
return E_FAIL;
}
if( FAILED( D3DXCreateTextureFromFile(g_pd3dDevice,"spotlite.bmp",&g_pTexture1)))
{
MessageBox(NULL,"创建纹理失败","spotlite.exe",MB_OK);
return E_FAIL;
}
CUSTOMVERTEX g_Vertices[] =
{
{ 50.0f, 50.0f, 0.5f, 0.0f, 0.0f,0.0f,0.0f,0.0f},
{ 600.0f, 50.0f, 0.5f, 0.0f, 1.0f,0.0f,1.0f,0.0f}, // x, y, z, rhw, color
{ 600.0f, 400.0f, 0.5f, 0.0f, 1.0f,1.0f,1.0f,1.0f},
{ 50.0f, 400.0f, 0.5f, 0.0f, 0.0f,1.0f,0.0f,1.0f },
};
if( FAILED( g_pd3dDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
{
return E_FAIL;
}
5、释放
if( g_pTexture0 != NULL )
g_pTexture0->Release();
if( g_pTexture1 != NULL )
g_pTexture1->Release();
6、贴图
在if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )中添加以下
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 2 );
g_pd3dDevice->SetTexture(0,g_pTexture0);
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
g_pd3dDevice->SetTexture(1,g_pTexture1);
g_pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );
g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE );
g_pd3dDevice->SetSamplerState(1,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
运行结果如下: