我有一个使用 D3DFMT_A8 格式的纹理。我想将其渲染为白色(即 RGB 分量均为 255)并使用纹理数据进行 alpha 混合。
如果可能的话,我想这样做而不必编写像素着色器(如无需更改即可使用现有着色器,以及固定功能管道)。
我可以让 alpha 混合位像任何其他纹理一样工作,但是 RGB 分量都被视为黑色,而我需要它们被视为白色...
最佳答案
似乎颜色/alpha 操作将 D3DFMT_A8 纹理的颜色分量解释为 rgb(0,0,0)。
因此您必须从 Material /顶点颜色中选择颜色分量,并从 alphamap 中选择 alpha 分量:
_d3d9Device.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1)
_d3d9Device.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_CURRENT)
_d3d9Device.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1)
_d3d9Device.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE)
然后你可以调制颜色纹理:
_d3d9Device.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE )
_d3d9Device.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT)
_d3d9Device.SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TEXTURE)
当然,必须启用alpha混合:
_d3d9Device.SetRenderState( D3DRS_ALPHATESTENABLE, False)
_d3d9Device.SetRenderState( D3DRS_ALPHABLENDENABLE, True)
_d3d9Device.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA)
_d3d9Device.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA)
关于c++ - Direct3D9 渲染 D3DFMT_A8 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1185702/