gpt4 book ai didi

c++ - 相当于 DirectX 渲染状态的 OpenGL

转载 作者:行者123 更新时间:2023-11-27 23:54:39 25 4
gpt4 key购买 nike

我在这里处理遗留系统,所以着色器不是一个选项。

我需要修改的代码有一个渲染管道,其中大部分显示被渲染为纹理,然后该纹理被绘制到屏幕上。它应该看起来一开始就好像从未渲染过纹理一样。

它通过调用此函数在 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 等价物?

我一直在尝试不同的组合,让自己发疯,虽然我可以接近,但我从来没有完全达到它看起来和一开始就没有渲染到纹理一样的地步——半透明区域无论我尝试什么,要么变暗要么变亮。

最佳答案

除非我遗漏了什么,否则您应该能够比较 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);
}

关于c++ - 相当于 DirectX 渲染状态的 OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43461703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com