gpt4 book ai didi

c++ - OpenGL 与 FBO RTT,在不该混合的时候混合

转载 作者:太空宇宙 更新时间:2023-11-04 12:27:13 34 4
gpt4 key购买 nike

这应该很简单,但它占用了我几个小时的时间,而且我不知道发生了什么。

我正在将纯色全屏四边形渲染为纹理,然后使用 glGetTexImage 读回结果。它与 GPGPU 相关,所以我希望 alpha 值的行为就好像它是其他三个中的任何一个一样。我在 10.5 的 MacBook Pro 上使用 FBO,纹理格式 GL_RGBA32F_ARB,NVidia 卡,如果有的话。

只有当我指定的 alpha 为 1 时,我才会返回正确的颜色;与任何其他值一起,它似乎与帧缓冲区中已有的内容混合,即使我已明确禁用 GL_BLEND。我还尝试启用混合并使用 glBlendFunc(GL_ONE, GL_ZERO) 但最终结果是相同的。我可以在渲染之前将帧缓冲区清除为零,这会修复它,但我想了解为什么这是必要的。作为第二个测试,当我只想返回原始 4 channel 颜色时,渲染两个重叠的四边形会给出混合结果。纯色四边形肯定会完全覆盖帧缓冲区中的像素吗?我猜我误解了一些基本的东西。谢谢。

 const size_t res = 16;
GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F_ARB,
res, res, 0, GL_RGBA, GL_FLOAT, 0);
glBindTexture(GL_TEXTURE_2D, 0);

GLuint fbo;
glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0);
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);

glViewport(0, 0, res, res);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, res, 0, res, -1, 1);

glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);

//glEnable(GL_BLEND);
//glBlendFunc(GL_ONE, GL_ZERO);
glDisable(GL_BLEND);
glDisable(GL_DEPTH_TEST);

glColor4f(0.2, 0.3, 0.4, 0.5);

for (int i=0; i<2; ++i) {
glBegin(GL_QUADS);
glVertex2i(0,0);
glVertex2i(res, 0);
glVertex2i(res, res);
glVertex2i(0, res);
glEnd();
}

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

std::vector<float> tmp(res*res*4);
glBindTexture(GL_TEXTURE_2D, tex);
glGetTexImage(GL_TEXTURE_2D, 0,
GL_RGBA, GL_FLOAT, &tmp.front());
const float * const x = &tmp.front();
cerr << x[0] << " " << x[1] << " " << x[2] << " " << x[3] << endl;
// prints 0.3 0.45 0.6 0.75

glDeleteTextures(1, &tex);
glDeleteFramebuffersEXT(1, &fbo);

最佳答案

这不是一个很好的答案,但是,有些事情需要注意:

  • 您所观察到的并不像真正的混合。首先,您的后台缓冲区最初是 rgba=0,因此针对它的 alpha 混合会给出 0,而不是您可能观察到的 0.2 0.3 0.4 0.5。
  • 我的倾向是您以某种方式将相同的纹理缓冲区设置为纹理 帧缓冲区附件。这在规范中未定义 (section 4.4.3) .不过,在您提供的代码片段中,您执行了 glBindTexture(GL_TEXTURE_2D, 0),这应该确保不是这种情况……如果您错过了,我会放在这里.

关于c++ - OpenGL 与 FBO RTT,在不该混合的时候混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1583434/

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