使用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()
查询结果:
GL_TRANSFORM_FEEDBACK_BINDING: 1
GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 1
让另外一对这样的对象:
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()
查询结果:
GL_TRANSFORM_FEEDBACK_BINDING: 2
GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 2
现在出现问题:创建第二对后,绑定前一个转换缓冲区对象tfo1
...
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfo1);
...导致以下查询结果:
GL_TRANSFORM_FEEDBACK_BINDING: 1
GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 2 <--- WHY NOT 1?
绑定的TFO现在是tfo1
但是数组缓冲区绑定尚未更改。
看起来好像缓冲区绑定不是TFO状态的一部分但是可以吗?管理缓冲区绑定是否是TFO存在的主要原因?
答案 0 :(得分:2)
根据OpenGL 4.5 core profile specification,通用GL_TRANSFORM_FEEDBACK_BUFFER_BINDING
(将使用glGetIntegerv
查询以及索引绑定(将使用glGetIntegeri_v
查询)均为部分变换反馈对象状态。第13.2.1节&#34;变换反馈对象&#34;状态(强调我的)
通过将
GenTransformFeedbacks
返回的名称与命令绑定来创建转换反馈对象void BindTransformFeedback( enum target, uint id );
生成的变换反馈对象是一个新的状态向量,包含表23.48中列出的所有状态和相同的初始值。
表23.48包含:
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 [...]
因此,在您的示例中,切换回tfo1
也应该将通用转换缓冲区反馈绑定恢复回vbo1
。我试过你的例子。在AMD实现(Windows 7,Firepro 15.201.2401驱动程序)上,它的行为符合规范。但是,使用NVidia(Linux,370.28),我得到的结果与您描述的相同。有趣的是,甚至Nvidia自己的来自GL_NV_transform_feedback2
的transfrom反馈对象的版本也使用相似的语言,并且明确地将通用绑定定义为转换反馈对象状态的一部分。所以我说你刚刚打了一些Nvidia的bug。