我非常渴望在DirectX中实现所需的alpha混合效果。 我正在尝试绘制纹理,并在其上绘制彩色三角形条。
尽管我尝试了所有尝试,但是条带的颜色似乎受到之前绘制的纹理颜色的影响。即使我将D3DRS_ALPHABLENDENABLE设置为FALSE,我仍然会看到颜色受到影响。
以下是图像的外观(使用openGL渲染)
这是我使用directX渲染得到的:
如您所见,第二个图像紫色条带有黄色阴影,没有任何特殊原因:((黄色矩形是纹理,而不是多边形)。
以下是我在引擎初始化中使用的设置:
m_pDirect3D_Device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
m_pDirect3D_Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
m_pDirect3D_Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
m_pDirect3D_Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_BLENDDIFFUSEALPHA);
m_pDirect3D_Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
m_pDirect3D_Device->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
这些设置是唯一能让我正确混合纹理的设置,但我无法实现正确的多边形混合。任何帮助?
答案 0 :(得分:1)
我最终想通了。 除了Alpha Blending之外,还有一个颜色混合。 因此,DirectX将最后一个纹理的颜色与最后一个基元合并。 为了解决这个问题,我们需要设置:
m_pDirect3D_Device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTSS_COLORARG1);
m_pDirect3D_Device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
在绘制基元之前- 意味着仅从基元(Diffuse)获取颜色,并且:
m_pDirect3D_Device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTSS_COLORARG1);
m_pDirect3D_Device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
在绘制纹理之前 - 意味着只使用纹理颜色。
答案 1 :(得分:0)
旧主题,但很有用!
我注意到一个小细节,只是为了避免一些混淆:我认为SetTextureStageState
的参数应该是D3DTOP_SELECTARG1
而不是D3DTSS_COLORARG1
(无论如何都是相同的值,所以没什么大不了的! )。