0

我正在尝试将 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 中那样工作。不知道我在这里错过了什么......

4

1 回答 1

1

alpha 混合本身是正确执行的。否则,每个粒子都会看起来很奇怪。有些粒子的某些部分没有画出来,是因为它们在其他一些粒子的透明部分后面。

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

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

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

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

于 2012-08-06T13:11:38.540 回答