1

我有一个使用 D3DFMT_A8 格式的纹理。我想把它渲染成白色(即 RGB 分量都是 255),并使用纹理数据进行 alpha 混合。

如果可能的话,我想在不必编写像素着色器的情况下执行此操作(如使用现有着色器而不进行更改,以及固定功能管道)。

我可以让 alpha 混合位像任何其他纹理一样工作,但是 RGB 分量都被视为黑色,而我需要将它们视为白色......

4

1 回答 1

1

似乎颜色/阿尔法操作将 D3DFMT_A8 纹理的颜色分量解释为 rgb(0,0,0)。

所以你必须从材质/顶点颜色中选择颜色分量,从 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)
于 2009-07-28T22:42:08.163 回答