我对使用顶点着色器处理缓冲区而不产生任何渲染输出感兴趣。这是相关的片段:
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
,我认为不应该使用帧缓冲。
那么,有没有办法在没有帧缓冲区的情况下使用变换反馈,或者我是否需要生成并绑定帧缓冲区,即使我不关心它的内容?
答案 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实现。