|
|

楼主 |
发表于 2008-7-5 20:18:00
|
显示全部楼层
Re: 关于多重纹理混合的问题
谢谢各位的解答,我还想请问一下,就是我的显卡虽然不支持像素着色器,但是可以用REF模式来观看运行结果,那么请问使用像素着色器最多可以混合几层纹理呢?
还有一个问题就是,使用固定管线进行多遍渲染,但是我想尽可能减少绘制次数,能不能通过下面的途径,就是先创建一个透明纹理,然后将两个纹理混合之后,使用RendertoTexture方法将混合之后的纹理渲染到创建好的透明纹理上面,最后再将这个纹理贴上去,有没有可能通过循环语句将更多的纹理进行混合然后贴上去,从而减少绘制顶点的次数呢?我将核心代码贴出来,并将完整代码上传,麻烦各位帮我看看好吗?拜托了!
LPDIRECT3DSURFACE9 pRenderTarget;
g_pd3dDevice->GetRenderTarget(0 , &pRenderTarget);
g_pd3dDevice->SetRenderTarget(0 , g_pRenderSurface);
g_pd3dDevice->Clear(0 , 0 , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER ,D3DCOLOR_ARGB(0, 255 , 0, 0) , 1 , 0);
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{ g_pd3dDevice->SetRenderState(D3DRS_LIGHTING , FALSE);
g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
}
g_pd3dDevice->SetRenderTarget(0 , pRenderTarget);
g_pd3dDevice->Clear(0 , 0 , D3DCLEAR_TARGET| D3DCLEAR_ZBUFFER ,3DCOLOR_XRGB(255 , 255 , 255) , 1 , 0);
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{ D3DXMATRIX matWorld;
g_pd3dDevice->SetTransform(D3DTS_WORLD , &matWorld);
SetTransform();
g_pd3dDevice->SetTexture(0 , g_pRenderTexture);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
g_pd3dDevice->SetSamplerState(0 , D3DSAMP_ADDRESSU , D3DTADDRESS_MIRROR);
g_pd3dDevice->SetSamplerState(0 , D3DSAMP_ADDRESSV , D3DTADDRESS_MIRROR);
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING , FALSE);
g_pd3dDevice->SetStreamSource(0 , g_pVB , 0 , sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->SetTexture(0 , g_pTexture);
g_pd3dDevice->SetTexture(1 , g_pTexture1);
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT );
g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADD);//MODULATE2X );
g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP , 0 , 2);
g_pd3dDevice->EndScene();
}
g_pd3dDevice-> resent(0 , 0 , 0 , 0);
|
|