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

时间:2016-09-14 23:55:38

标签: opengl

使用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存在的主要原因?

1 个答案:

答案 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。