Direct3D9渲染D3DFMT_A8纹理

时间:2009-07-26 22:12:51

标签: c++ direct3d

我有一个使用D3DFMT_A8格式的纹理。我想渲染它,好像颜色是白色的(即RGB组件都是255),并使用纹理数据进行alpha混合。

我想这样做,而不必在可能的情况下编写像素着色器(以便在没有更改的情况下使用现有着色器,以及固定功能管道)。

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

1 个答案:

答案 0 :(得分:1)

似乎color / alpha操作将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)