opengl - 写入 OpenGL 多个渲染缓冲区失败
问题描述
不确定是什么问题,写入多个渲染缓冲区时无法读取像素。这是代码:
设置代码:
// gen framebuffer object
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
// gen renderbuffer 0
glGenRenderbuffers(1, &rbo_color0);
glBindRenderbuffer(GL_RENDERBUFFER, rbo_color0);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB, w, h);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo_color0);
// gen renderbuffer 1
glGenRenderbuffers(1, &rbo_color1);
glBindRenderbuffer(GL_RENDERBUFFER, rbo_color1);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RED_INTEGER, w, h);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, rbo_color1);
// gen depth buffer
glGenRenderbuffers(1, &rbo_depth);
glBindRenderbuffer(GL_RENDERBUFFER, rbo_depth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, w, h);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo_depth);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
渲染和读取像素代码:
// setup shader and uniforms...
// bind framebuffer and clear color/depth buffer
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glEnable(GL_DEPTH_TEST);
glClearColor(0.f, 0.f, 0.f, 0.1f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
const GLuint buffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
glDrawBuffers(2, buffers);
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, index_count, GL_UNSIGNED_INT, (void*)0);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadPixels(x, y, 1, 1, GL_RGB, GL_FLOAT, data);
glReadBuffer(GL_COLOR_ATTACHMENT1);
glReadPixels(x, y, 1, 1, GL_RED_INTEGER, GL_INT, (int*)(data) + 4);
glBindVertexArray(0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
我在着色器中使用了布局限定符作为输出,应该没有任何问题。所以我认为缓冲区设置或渲染代码可能有问题。当只有一个渲染缓冲区(rbo_color0)时,我已成功读取像素。主要区别在于:
- renderbuffer1 没有生成代码;
- 渲染时使用 glDrawBuffer(rbo_color0);
- rbo_color0 的格式是 GL_RGBA(仔细检查相应 glRenderbufferStorage/glReadBuffer 调用中的格式设置,这里没有问题);
- rbo_color1 没有读取像素调用。
有什么帮助吗?
解决方案
GL_RED_INTEGER
不是正确的内部格式,因为它可以用于 . 的第二个参数glRenderbufferStorage
。内部格式的适当枚举器常量是GL_R32I
.
请参阅OpenGL 4.6 API 兼容性配置文件规范;8.26。纹理图像加载和存储;第 334 页
如果您要检查 OpenGL 错误 ( glGetError
),那么您会得到一个INVALID_ENUM
错误。
更改渲染缓冲区存储规范,以解决问题:
glRenderbufferStorage(GL_RENDERBUFFER, GL_R32I, w, h);
请注意,您应该通过以下方式检查帧缓冲区的完整性glCheckFramebufferStatus
:
GLenum fb_status = glCheckFramebufferStatus( GL_FRAMEBUFFER );
if ( fb_status != GL_FRAMEBUFFER_COMPLETE )
{
// error handling
}
推荐阅读
- visual-studio-2019 - Visual Studio 19 在 AWS 实例上运行时崩溃
- regex - 如何使用 xpath 选择特定的子节点?
- javascript - Recharts:如何使用 ComposedChart 从头到尾绘制阶梯线
- mysql - Mysql同时为表和列添加注释成本很高
- r - 使用 survRM2 包中的 rmst2 函数(受限制的平均生存时间)时出错
- javascript - 如何打开单个菜单?
- asynchronous - 超时的用户输入无法按预期工作
- javascript - React Native Image 组件源作为 ES6 导入图像
- javascript - TypeError:无法读取未定义的属性“标题”*运行时错误*
- flutter - Flutter - 从网络加载完整内容页面