|
|
发表于 2007-7-4 23:19:00
|
显示全部楼层
Re:请教如何换贴图纹理?
我用灵活顶点的方法可以处理
DX渲染模型前需要先调用一个SetTexture的函数来设置接下来的渲染顶点将采用什么纹理贴图
那么只要在模型每次刷新前修改了SetTexture所设置的纹理贴图,那么就会实现切换纹理
首先把贴图纹理创建好:
if( FAILED( D3DXCreateTextureFromFile( g_pD3DDevice, "uv.bmp", &g_pTexture ) ) )
{
// If texture is not in current folder, try parent folder
if( FAILED( D3DXCreateTextureFromFile( g_pD3DDevice, "..\\uv.bmp", &g_pTexture ) ) )
{
MessageBox(NULL, "Could not find uv.bmp", "Textures.exe", MB_OK);
return E_FAIL;
}
}
if( FAILED( D3DXCreateTextureFromFile( g_pD3DDevice, "uv1.bmp", &g_pTexture1 ) ) )
{
// If texture is not in current folder, try parent folder
if( FAILED( D3DXCreateTextureFromFile( g_pD3DDevice, "..\\uv1.bmp", &g_pTexture1 ) ) )
{
MessageBox(NULL, "Could not find uv1.bmp", "Textures.exe", MB_OK);
return E_FAIL;
}
然后就是渲染,我画了两个方形,由于这个程序是自己学习拿来当试验乱写的乱添的
所以可能有点混乱,主渲染的部分贴出来,对付着看应该能看清楚^_^
HRESULT Render()
{
if(g_pD3DDevice== NULL)
{
return E_FAIL;
}
//清除后台缓冲区颜色为黑色
g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
//开始渲染
g_pD3DDevice->BeginScene();
D3DXMATRIX matWorld,move;
//设置旋转、相机和投影矩阵
g_pD3DDevice->SetTexture( 0, g_pTexture );
g_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP,D3DTOP_SELECTARG1);//禁止顶点颜色对纹理过渡
//渲染
g_pD3DDevice->GetTransform(D3DTS_WORLD,&matWorld);
SetupRotation();
SetupCamera();
SetupPerspective();
g_pD3DDevice->SetStreamSource(0,g_pVertexBuffer,0,sizeof(CUSTOMVERTEX));
g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,4,8);
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,14,2);
//结束渲染
g_pD3DDevice->SetTransform(D3DTS_WORLD,&matWorld);
SetupRotation1();
if(g_textChange) g_pD3DDevice->SetTexture( 0, g_pTexture1 );
else g_pD3DDevice->SetTexture( 0, g_pTexture );
g_pD3DDevice->SetStreamSource(0,g_pVertexBuffer,0,sizeof(CUSTOMVERTEX));
g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);//d8中的SetVertexShader(D3DFVF_CUSTOMVERTEX),在d9中如果用此函数可为:SetVertexShader(NULL)
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,4,8);
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,14,2);
g_pD3DDevice->SetTransform(D3DTS_WORLD,&matWorld);
g_pD3DDevice->EndScene();
//交换前后缓冲区
return g_pD3DDevice-> resent(NULL,NULL,NULL,NULL);
} |
|