我在这里处理遗留系统,因此着色器不是一种选择。
我需要修改的代码有一个渲染管道,其中大部分显示被渲染到纹理,然后该纹理被绘制到屏幕上。预计它看起来就像从未首先渲染到纹理一样。
它通过调用此函数在DirectX中完成此操作:
void RenderTargetChanged(bool isRenderToTexture)
{
if (!isRenderToTexture)
{
gDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
gDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
gDevice->SetRenderState(D3DRS_SRCBLENDALPHA,D3DBLEND_SRCALPHA);
gDevice->SetRenderState(D3DRS_DESTBLENDALPHA,D3DBLEND_INVSRCALPHA);
gDevice->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE,FALSE);
}
else
{
gDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
gDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
gDevice->SetRenderState(D3DRS_SRCBLENDALPHA, D3DBLEND_ONE);
gDevice->SetRenderState(D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA);
gDevice->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE);
}
}
(注意,两个分支之间的唯一区别是D3DRS_SRCBLENDALPHA和D3DRS_SEPERATEALPHABLENDENABLE的值)
什么是OpenGL等价物?
我一直在疯狂地尝试不同的组合,虽然我可以得到CLOSE,但我从来没有完全达到它看起来一样的地步,就好像它首先没有渲染到纹理一样 - 半透明区域无论我做什么,要么变暗或变亮。
答案 0 :(得分:3)
除非我遗漏了某些内容,否则您应该能够比较D3DBLEND enumeration和glBlendFunc()
的文档。
D3DBLEND_SRCALPHA
转换为GL_SRC_ALPHA
D3DBLEND_INVSRCALPHA
转换为GL_ONE_MINUS_SRC_ALPHA
D3DBLEND_ONE
转换为GL_ONE
如果要单独指定alpha分量,则需要使用glBlendFuncSeparate()
:
glEnable(GL_BLEND);
if (!isRenderToTexture) {
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBlendEquation(GL_FUNC_ADD);
} else {
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
}