Direct3D中的Alpha混合9.一些基元不会在纹理后面渲染

时间:2014-05-12 16:14:23

标签: directx alpha direct3d blending

我在游戏中启用了alpha混合,但是一些基元并没有在透明纹理后面渲染。

Screenshot

Screenshot http://oi62.tinypic.com/t6rlv7.jpg

以下是我的渲染状态:

d3ddevice->SetRenderState(D3DRS_LIGHTING, true);
d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
d3ddevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
d3ddevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(15, 15, 15));
d3ddevice->SetRenderState(D3DRS_NORMALIZENORMALS, TRUE);
d3ddevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
d3ddevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
d3ddevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
d3ddevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);

d3ddevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
d3ddevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);

d3ddevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );

d3ddevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_NONE);
d3ddevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_NONE);
d3ddevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);

1 个答案:

答案 0 :(得分:0)

这里发生的是透明对象仍然被写入深度缓冲区,因此阻止它们后面的对象被渲染。有(至少)两种方法可以解决这个问题。

  1. 对场景中的所有透明对象进行排序,使其从后向前渲染。您需要在代码中执行此操作,D3D不会为您处理此问题。 Here is an MSDN article就此而言。

  2. 看起来您渲染的所有对象在任何给定点都是完全透明或完全不透明的。在这种情况下,有一种更简单的方法来处理透明度:您可以使用alpha测试来丢弃所有具有0 alpha(或alpha低于某个阈值,例如128)的片段。 Here is an article关于如何做到这一点。如果使用着色器,则可以使用discard命令丢弃所有透明片段。