在没有帧缓冲区的情况下转换反馈?

Posted

技术标签:

【中文标题】在没有帧缓冲区的情况下转换反馈?【英文标题】:Transform feedback without a framebuffer? 【发布时间】:2014-06-09 01:42:32 【问题描述】:

我对使用顶点着色器处理缓冲区而不产生任何渲染输出感兴趣。这是相关的sn-p:

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,所以我认为不需要帧缓冲区。

那么,有没有办法在没有帧缓冲区的情况下使用转换反馈,或者我是否需要生成和绑定帧缓冲区,即使我不关心它的内容?

【问题讨论】:

如果您没有绑定 FBO 且没有默认帧缓冲区,您希望 glCheckFramebufferStatus (...) 返回什么? 如果 target 是默认帧缓冲区,则返回 GL_FRAMEBUFFER_UNDEFINED,但默认帧缓冲区不存在。 我完全惊讶于得到与帧缓冲区相关的错误,因为我的印象是GL_RASTERIZER_DISCARD_EXT 意味着不需要帧缓冲区。因此,我获得了有关帧缓冲区情况的更多信息,并在此处包含了该信息,以防它可能有助于回答问题。 【参考方案1】:

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

OpenGL 4.4 Core Specification - 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 实现。

【讨论】:

我明白了。谢谢。 (是的,不幸的是,目前我仅限于 OpenGL 2.1 + 一些扩展。)

以上是关于在没有帧缓冲区的情况下转换反馈?的主要内容,如果未能解决你的问题,请参考以下文章

如何将原始 RGB 帧缓冲区文件转换为可视格式?

OpenGL 帧缓冲区缺失面

将帧缓冲区转储转换为图像(bmp、png 等)

Python Webkit 使用虚拟帧缓冲区制作网站截图

使用 stbi_write_png 从 OpenGL 帧缓冲区保存的 PNG 向右移动

帧缓冲区大小和视口关系