Directx Direct3D 9中的Alpha混合。有些原语是';纹理背后的t渲染

Directx Direct3D 9中的Alpha混合。有些原语是';纹理背后的t渲染,directx,alpha,direct3d,blending,Directx,Alpha,Direct3d,Blending,我在游戏中启用了alpha混合,但一些基本体没有在透明纹理后面渲染 以下是我的渲染状态: d3ddevice->SetRenderState(D3DRS_LIGHTING, true); d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); d3ddevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); d3ddevice->SetRenderState(D3DRS_

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

以下是我的渲染状态:

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);

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

  • 对场景中的所有透明对象进行排序,使其从后向前渲染。您需要在代码中执行此操作,D3D不会为您处理此操作。在这个问题上

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


  • 我不明白你的截图。透明纹理在哪里?如果要在透明物体后面绘制对象,必须先绘制它们。否则,深度测试将丢弃这些像素。