|
|
我在地形上面加一个天空球
渲染如下
m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
m_pD3DDevice->BeginScene();
m_pBallSky->Render(); //天空球
m_pBruteForce->Render(); //地形
m_pD3DDevice->EndScene();
m_pD3DDevice-> resent(NULL, NULL, NULL, NULL);
结果: 地形能正常显示,但天空球的贴图不能正常显示
注:下面分别是地形和天空球的渲染函数
1:地形渲染
void CBruteForce::Render()
{
m_pDevice->SetFVF( BRUTEREFORCE_FVF );
m_pDevice->SetRenderState( D3DRS_LIGHTING, false );
m_pDevice->SetStreamSource( 0, m_pVertexBuffer,0, sizeof( BRUTEFORCE_VERTEX ) );
m_pDevice->SetIndices( m_pIndexBuffer );
m_pDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
//设置漫反射颜色的来源(材质、漫反射顶点颜色、镜面反射顶点颜色)
//m_pDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR2 );
//地形纹理
m_pDevice->SetTexture( 0, m_pTexture );
m_pDevice->SetSamplerState( 0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR );
m_pDevice->SetSamplerState( 0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR );
//设置处理纹理的索引号
m_pDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
//材质源:当前材质
m_pDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
//是当前材质作为该纹理阶段的输出
m_pDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
//细节纹理
m_pDevice->SetTexture( 1, m_pDetailTex );
m_pDevice->SetSamplerState(1,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
m_pDevice->SetSamplerState(1,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
//设置处理纹理的索引号
m_pDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
//相乘的参数1: 当前材质
m_pDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
//相乘的参数2: 前一个材质
m_pDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
//颜色混合方式
m_pDevice->SetTextureStageState( 1, D3DTSS_COLOROP,D3DTOP_ADD );
m_pDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
//光照图
m_pDevice->SetTexture( 2, m_pLightTex );
m_pDevice->SetSamplerState( 2,D3DSAMP_MINFILTER,D3DTEXF_LINEAR );
m_pDevice->SetSamplerState( 2,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR );
m_pDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 2 );
m_pDevice->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pDevice->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_pDevice->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_pDevice->SetTextureStageState( 2, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_pDevice->DrawIndexedPrimitive(
D3DPT_TRIANGLELIST,
0,
0,
m_iSize * m_iSize,
0,
( m_iSize - 1 ) * ( m_iSize - 1) * 2 );
}
2:天空球渲染
void BallSky::Render()
{
m_pDevice->SetRenderState(D3DRS_LIGHTING,false);
m_pDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
m_pDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
m_pDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
m_pDevice->SetFVF( SKY_FVF );
//天空
m_pDevice->SetTexture( 0, m_pTexture );
m_pDevice->SetSamplerState( 0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR );
m_pDevice->SetSamplerState( 0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR );
//设置处理纹理的索引号
m_pDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
//材质源:当前材质
m_pDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
//是当前材质作为该纹理阶段的输出
m_pDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_pDevice->SetStreamSource( 0, m_pVertexBuffer, 0, sizeof( SSKY_VERTEX ) );
for ( int i=0; i<m_iNumVertex/4; i++ )
{
m_pDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, i*4, 2 );
}
} |
|