OpenGL 3.2 上的每渲染目标混合



我目前在我的目标平台上被限制为 OpenGL 3.2,我无法访问glBlendFunci。我可以使用glBlendFuncglBlendFuncSeparate.例如,在 OpenGL 4.4 上,我有以下代码使用glBlendFunci.如何在 OpenGL 3.2 上以相同的结果替换它?创建单独的传球会更好还是会损害性能?

glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
// generate accum texture
glBindTexture(GL_TEXTURE_2D, accum);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, w, h, 0, GL_RGBA, GL_FLOAT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, accum, 0);
// generate reveal texture
glBindTexture(GL_TEXTURE_2D, reveal);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, w, h, 0, GL_RED, GL_FLOAT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, reveal, 0);

// blending
glBlendFunci(0, GL_ONE, GL_ONE);
glBlendFunci(1, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);

这看起来像是试图实现McGuire和Bavoil的独立于订单的透明方法(2015(。

我遇到了同样的问题,试图在 OpenGL 3.2 中实现它,但没有 glBlendFunci 用于每个渲染目标混合。

就我而言,我通过其原始论文"清单 4"中的重构方法使其工作(至少作为概念验证(,该方法更改了累积/揭示存储并将glBlendFuncSeparate(GL_ONE, GL_ONE, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA)用于两个目标。

相关内容

最新更新