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