【发布时间】:2016-09-14 23:55:38
【问题描述】:
使用 OpenGL 4.5 和 NVidia 卡,我注意到当通过glBindTransformFeedback() 切换变换反馈对象时,与glBindBufferBase() 建立的关联数组缓冲区绑定不会改变。
看看下面的sn-ps:
假设有一对变换反馈和顶点缓冲对象:
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 存在的主要原因吗?
【问题讨论】:
-
"管理缓冲区绑定不是 TFO 存在的主要原因吗?" 不;反馈对象存在的主要原因是能够暂停和恢复反馈操作。当然,它们确实包含缓冲区对象绑定。但是您应该向我们展示您查询这些内容的实际代码。因为我强烈怀疑您没有正确查询缓冲区。
-
变换反馈源/目标缓冲区选择的测试用例link
标签: opengl