Opengl 变换反馈对象的缓冲区绑定

Opengl 变换反馈对象的缓冲区绑定,opengl,Opengl,使用OpenGL 4.5和NVidia卡,我注意到当通过glBindTransformFeedback()切换变换反馈对象时,使用glBindBufferBase()建立的关联数组缓冲绑定不会被更改 请查看以下代码片段: 假设存在一对变换反馈和顶点缓冲区对象: GLuint tfo1, vbo1; glGenTransformFeedbacks(1, &tfo1); glGenBuffers(1, &vbo1); glBindBuffer(GL_ARRAY_BUFFER, vbo

使用OpenGL 4.5和NVidia卡,我注意到当通过
glBindTransformFeedback()
切换变换反馈对象时,使用
glBindBufferBase()
建立的关联数组缓冲绑定不会被更改

请查看以下代码片段:

假设存在一对变换反馈和顶点缓冲区对象:

GLuint tfo1, vbo1;
glGenTransformFeedbacks(1, &tfo1);
glGenBuffers(1, &vbo1);
glBindBuffer(GL_ARRAY_BUFFER, vbo1);
glBufferData(GL_ARRAY_BUFFER, 123 * sizeof(float), nullptr, GL_DYNAMIC_DRAW);

glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfo1);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbo1);
使用
glGetIntegerv()
查询结果:

假设存在另一对这样的对象:

GLuint tfo2, vbo2;
glGenTransformFeedbacks(1, &tfo2);
glGenBuffers(1, &vbo2);
glBindBuffer(GL_ARRAY_BUFFER, vbo2);
glBufferData(GL_ARRAY_BUFFER, 123 * sizeof(float), nullptr, GL_DYNAMIC_DRAW);

glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfo2);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbo2);
使用
glGetIntegerv()
查询结果:

现在问题来了:创建第二对后,绑定上一个transform buffer对象
tfo1

glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfo1);
…导致以下查询结果:

GL_TRANSFORM_FEEDBACK_BINDING: 1
GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 2   <--- WHY NOT 1?
GL\u转换\u反馈\u绑定:1
GL\u TRANSFORM\u FEEDBACK\u BUFFER\u BINDING:2根据,通用的
GL\u TRANSFORM\u FEEDBACK\u BUFFER\u BINDING
(用
glGetIntegerv
查询)和索引绑定(用
glGetIntegeri\u v
查询)都是变换反馈对象状态的一部分。第13.2.1节“变换反馈对象”状态(重点)

转换反馈对象是通过将
GenTransformFeedbacks
返回的名称与命令绑定而创建的
无效反馈(枚举目标,uint id);
产生的变换反馈对象是一个新的状态向量,包含所有状态,具有表23.48中列出的相同初始值。

表23.48包含以下内容:


因此,在您的示例中,切换回
tfo1
也应将通用转换缓冲区反馈绑定恢复回
vbo1
。我尝试了您的示例。在AMD实现(Windows 7,Firepro 15.201.2401驱动程序)上,它的行为如规范所述。但是,对于NVidia(Linux,370.28),我得到了与您描述的相同的结果。有趣的是,即使是Nvidia自己的transfrom反馈对象版本也使用类似的语言,并明确地将通用绑定定义为transform feedback对象状态的一部分。因此我想说,您刚刚遇到了一些Nvidia错误。

”管理缓冲区绑定不是TFO存在的主要原因吗?“否;反馈对象存在的主要原因是能够暂停和恢复反馈操作。当然,它们确实包含缓冲区对象绑定。但您应该向我们展示查询这些内容的实际代码。因为我强烈怀疑您没有正确查询缓冲区。转换反馈源/目标缓冲区选择的测试用例。”
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfo1);
GL_TRANSFORM_FEEDBACK_BINDING: 1
GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 2   <--- WHY NOT 1?
TRANSFORM_FEEDBACK_BUFFER_BINDING | Z+   | GetIntegerv   | 0 | Buffer object bound to generic bind point for transform feedback 
TRANSFORM_FEEDBACK_BUFFER_BINDING |n x Z+| GetIntegeri_v | 0 | Buffer object bound to each transform feedback attribute stream
[...]