【发布时间】: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