5

我有兴趣使用顶点着色器来处理缓冲区而不产生任何渲染输出。这是相关的片段:

glUseProgram(program);

GLuint tfOutputBuffer;
glGenBuffers(1, &tfOutputBuffer);
glBindBuffer(GL_ARRAY_BUFFER, tfOutputBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(double)*4*3, NULL, GL_STATIC_READ);

glEnable(GL_RASTERIZER_DISCARD_EXT);

glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfOutputBuffer);
glBeginTransformFeedbackEXT(GL_TRIANGLES);

glBindBuffer(GL_ARRAY_BUFFER, positionBuffer);
glEnableVertexAttribArray(positionAttribute);
glVertexAttribPointer(positionAttribute, 4, GL_FLOAT, GL_FALSE, sizeof(double)*4, 0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);

glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_INT, 0);

这工作正常,直到glDrawElements()调用,这导致GL_INVALID_FRAMEBUFFER_OPERATION. 并glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);返回GL_FRAMEBUFFER_UNDEFINED

我认为这是因为我的 GL 上下文没有默认帧缓冲区,并且我没有绑定另一个 FBO。但是,由于我不关心渲染的输出并且我已经启用GL_RASTERIZER_DISCARD_EXT,我认为帧缓冲区应该是不必要的。

那么,有没有一种方法可以在没有 framebuffer 的情况下使用转换反馈,或者即使我不关心它的内容,我也需要生成和绑定一个 framebuffer?

4

1 回答 1

5

根据规范,这实际上是完全有效的行为。

OpenGL 4.4 核心规范- 9.4.4 帧缓冲区完整性对帧缓冲区操作的影响

GL_INVALID_FRAMEBUFFER_OPERATION尝试渲染到帧缓冲区或从中读取帧缓冲区不完整会生成错误。无论片段实际上是从帧缓冲区读取还是写入到帧缓冲区,都会生成此错误。例如,它是在调用渲染命令并且帧缓冲区不完整时生成的,即使GL_RASTERIZER_DISCARD已启用

您需要做的是创建一个带有 1 像素颜色附件的 FBO 并将其绑定。您必须拥有完整的 FBO 绑定,否则您将获得GL_INVALID_FRAMEBUFFER_OPERATION完整的规则之一,即至少附加 1 个完整的图像。

OpenGL 4.3 实际上允许您通过定义一个不带任何附件的 FBO 来绕过这个问题(请参阅:GL_ARB_framebuffer_no_attachments)。但是,由于您使用的是 EXT 形式的 FBO 和转换反馈,我怀疑您是否有 4.3 实现。

于 2014-06-09T02:14:35.170 回答