【问题标题】:OpenGL to DirectX translation - alpha blendingOpenGL 到 DirectX 的转换 - alpha 混合
【发布时间】:2012-08-25 23:41:24
【问题描述】:

我正在尝试将 OpenGL 渲染器转换为 DirectX9。它似乎主要工作,但两者似乎并没有就 alpha 混合的设置达成一致。在 OpenGL 中,我使用的是:

glDepthFunc(GL_LEQUAL);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

并且从不实际设置 GL_DEST_ALPHA,所以它是默认值。这工作正常。转换为 DirectX,我得到:

device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVSRCALPHA);

应该做同样的事情,但完全没有。我能得到的最接近的是:

device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_DESTALPHA);

几乎是正确的,但是如果几何图形自身重叠,则前面的 alpha 会覆盖后面的 alpha,并使更远的面不可见。作为记录,我正在进行的其他可能相关的渲染状态是:

device->SetRenderState(D3DRS_LIGHTING, FALSE);
device->SetRenderState(D3DRS_ZENABLE, TRUE);
device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);

在这一点上,我觉得我只是在随机更改状态以查看哪种组合可以提供最佳结果,但没有什么能像在 OpenGL 中那样工作。不知道我在这里错过了什么......

【问题讨论】:

  • device->SetRenderSate( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); device->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); 怎么样?
  • 我认为这是我首先尝试的,查看我正在使用的示例代码。虽然不起作用。前面的 alpha 总是覆盖更远的面上的 alpha,这使得这些面不可见。是否需要进行其他设置,以便 alpha 贴图可以在同一个绘制调用中进行多层处理? (我正在制作一个粒子引擎,但所有四边形都是在一次调用中绘制的,而不是一次绘制一个,以提高性能。)
  • 你能张贴你想要什么和你得到什么的截图吗?
  • 我会试试的 - 以前从未在这里发布过图片,让我们看看这是否有效:darrelhoffman.com/?attachment_id=190 嗯,只需点击链接。
  • 这看起来不像是 alpha 混合问题。尝试关闭 ZWriteEnable 或开启 alpha 测试。

标签: c++ opengl directx alphablending


【解决方案1】:

Alpha 混合本身已正确执行。否则,每个粒子都会看起来很奇怪。有些粒子的某些部分没有被绘制出来,是因为它们位于某些粒子的透明部分的后面。

要解决此问题,您有两种选择:

  1. 关闭粒子的 ZWriteEnable。这样,在粒子之后绘制的每个对象都将在它的前面。如果您的对象实际上应该在粒子后面并在之后绘制,这可能会导致问题。

  2. 启用粒子的 alpha 测试。 Alpha 测试是一种从目标中去除透明像素(给定特定阈值)的技术。这包括 ZBuffer。

顺便说一句。在渲染透明对象时,几乎总是需要对对象进行排序以解决 ZBuffer 问题。上述解决方案适用于一些特殊情况。

【讨论】:

    猜你喜欢
    • 2011-12-02
    • 2011-12-14
    • 1970-01-01
    • 2013-11-16
    • 2015-03-30
    • 1970-01-01
    • 2012-08-02
    • 2015-07-25
    • 1970-01-01
    相关资源
    最近更新 更多