【问题标题】:Alpha Blending problems in DirectX9DirectX9 中的 Alpha 混合问题
【发布时间】:2013-02-27 08:16:41
【问题描述】:

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

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

【问题讨论】:

    标签: c++ directx directx-9


    【解决方案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);
    

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

    【讨论】:

      【解决方案2】:

      老话题,但很有用!

      我注意到一个小细节,只是为了避免一些混淆:我认为SetTextureStageState 的参数应该是D3DTOP_SELECTARG1 而不是D3DTSS_COLORARG1(无论如何都是相同的值,所以没什么大不了的!)。

      【讨论】:

        猜你喜欢
        • 2013-09-14
        • 1970-01-01
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-17
        • 1970-01-01
        • 2011-09-23
        相关资源
        最近更新 更多