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

时间:2014-06-09 01:42:33

标签: opengl transform-feedback

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

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_OPERATIONglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);会返回GL_FRAMEBUFFER_UNDEFINED

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

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

1 个答案:

答案 0 :(得分:4)

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

  

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 )。但是,因为您正在使用EXO形式的FBO和转换反馈,我怀疑您有4.3实现。