0

我非常渴望在 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);

这些设置是唯一可以让我正确混合纹理的设置,但我无法实现正确的多边形混合。有什么帮助吗?

4

2 回答 2

1

我最终想通了。除了 Alpha Blending,还有一个 Color Blending。所以 DirectX 将最后一个纹理的颜色与最后一个图元合并。为了解决它,我们需要设置:

m_pDirect3D_Device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTSS_COLORARG1);
m_pDirect3D_Device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);

在绘制图元之前 - 意味着只从图元(漫反射)中获取颜色,并且:

m_pDirect3D_Device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTSS_COLORARG1);
m_pDirect3D_Device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);

在绘制纹理之前 - 意味着只使用纹理颜色。

于 2013-02-27T10:58:49.283 回答
0

Old topic, but useful one!

I noticed a small detail, just to avoid some confusion: I think that the parameter to SetTextureStageState should be D3DTOP_SELECTARG1 instead of D3DTSS_COLORARG1 (same value anyway, so no big deal!).

于 2015-09-14T12:13:49.327 回答