【问题标题】:D3D9 Alpha Blending on the surfaces表面上的 D3D9 Alpha 混合
【发布时间】:2012-04-05 09:56:43
【问题描述】:

我有一个表面(OffScreenPlain 或带有 D3DFMT_A8R8G8B8 的 RenderTarget),我将像素 (ARGB) 从第三方函数复制到该表面。在像素复制之前,Bits 由 LockRect 访问。

然后这个表面是 StretchRect 到 Backbuffer,即 (D3DFMT_A8R8G8B8)。 Surface 和 Backbuffer 是不同的维度。过滤设置为 D3DTEXF_NONE。

在创建 d3d 设备后,我按照 RenderState 设置进行了设置

D3DRS_ALPHABLENDENABLE -> TRUE
D3DRS_BLENDOP          -> D3DBLENDOP_ADD
D3DRS_SRCBLEND         -> D3DBLEND_SRCALPHA
D3DRS_DESTBLEND        -> D3DBLEND_INVSRCALPHA

但我没有看到 alpha 混合发生。我已经验证了 alpha 是以像素为单位指定的。

我通过创建一个顶点缓冲区并绘制一个三角形 (DrawPrimitive) 进行了一个简单的测试,该三角形 (DrawPrimitive) 使用 alpha 混合显示。

在此测试中,表面首先是 StretchRect,然后是 DrawPrimitive,表面内容显示时不使用 alpha 混合,而三角形显示时使用 alpha 混合。

我在这里缺少什么?谢谢

【问题讨论】:

    标签: direct3d alphablending direct3d9


    【解决方案1】:

    您提到的状态仅影响顶点。为了正确混合纹理,您需要指定纹理 alpha 如何与顶点混合。你这样做:

    d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
    d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
    d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
    

    默认情况下ALPHAOPSELECTARG1,即在渲染中只考虑纹理 Alpha。

    另一种解决方案是使用ID3DXSprite::Draw 方法将纹理复制到后台缓冲区。只需传递颜色D3DCOLOR_ARGB(X, 255, 255, 255),其中 X 是您的 alpha。这个方法会做所有的状态调整,最终的结果会符合你的期望。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 2010-11-20
      • 2017-03-31
      • 1970-01-01
      相关资源
      最近更新 更多