c++ - DirectX9 中的 Alpha 混合问题

标签 c++ directx directx-9

我非常渴望在 DirectX 中获得理想的 alpha 混合结果。 我正在尝试绘制纹理,并在其上绘制一个彩色三角形条。

尽管我做了所有尝试,但 strip 的颜色似乎受到之前绘制的纹理颜色的影响。即使我将 D3DRS_ALPHABLENDENABLE 设置为 FALSE,我仍然看到颜色受到影响。

这是图像的样子(用 openGL 渲染)

enter image description here

这是我使用 directX 渲染得到的结果:

enter image description here

如您所见,第二张图片紫色 strip 有黄色阴影,没有任何特定原因:((黄色矩形是纹理,不是多边形)。

这是我在引擎初始化中使用的设置:

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);

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

最佳答案

我终于明白了。 除了 Alpha 混合之外,还有颜色混合。 所以 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);

在绘制纹理之前 - 意思是只使用纹理颜色。

关于c++ - DirectX9 中的 Alpha 混合问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15107121/

相关文章:

c++ - 基准测试代码——我做的对吗?

c++ - 无法从我的 C++ 应用程序获得输出

C# 和方向键

C++ 智能感知 : expression must be a modifiable lvalue

c++ - linux/内核.h : No such file or directory

c++ - C/C++ 中的无限循环

wpf - Olive (Mono) 如何实现 (W)PF?

c++ - Windows 10 标题栏不工作

c++ - 使用 Directx 9 的屏幕空间反射

c++ - 将网格从 .obj(或任何其他)文件加载到 DirectX9/C++ 项目中