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