Opengl ARB_顶点_属性_绑定测试用例理解
我正在调查OpenGL Android deqp测试套装,并与其中一个案例相混淆。测试是dEQP-GLES31.functional.vertex\u attribute\u binding.usage.mixed\u usage.mixed\u api\u change\u binding\u point。 可以找到来源,兴趣线是1197-1213。我不知道,这是在耍花招Opengl ARB_顶点_属性_绑定测试用例理解,opengl,opengl-es,Opengl,Opengl Es,我正在调查OpenGL Android deqp测试套装,并与其中一个案例相混淆。测试是dEQP-GLES31.functional.vertex\u attribute\u binding.usage.mixed\u usage.mixed\u api\u change\u binding\u point。 可以找到来源,兴趣线是1197-1213。我不知道,这是在耍花招 const int maxUsedLocation = de::max(positionLoc, co
const int maxUsedLocation = de::max(positionLoc, colorLoc);
const int bindingPoint1 = maxUsedLocation + 1;
const int bindingPoint2 = maxUsedLocation + 2;
// bind data using old api
gl.glBindBuffer(GL_ARRAY_BUFFER, m_buffer);
gl.glVertexAttribPointer(bindingPoint1, 4, GL_FLOAT, GL_FALSE, (glw::GLsizei)(2 * sizeof(tcu::Vec4)), (const deUint8*)DE_NULL);
gl.glVertexAttribPointer(bindingPoint2, 4, GL_FLOAT, GL_FALSE, (glw::GLsizei)(2 * sizeof(tcu::Vec4)), (const deUint8*)DE_NULL + sizeof(tcu::Vec4));
// change buffer binding point with vertex_attrib_binding
gl.glVertexAttribFormat(positionLoc, 4, GL_FLOAT, GL_FALSE, 0);
gl.glVertexAttribFormat(colorLoc, 4, GL_FLOAT, GL_FALSE, 0);
gl.glVertexAttribBinding(positionLoc, bindingPoint1);
gl.glVertexAttribBinding(colorLoc, bindingPoint2);
首先,bindingPoint1
和bindingPoint2
是以一种奇怪的方式初始化的(着色器中最大数量顶点位置的增量)。然后它被用作glvertexattributepointer
中的顶点属性位置(?)。之后,它用作glVertexAttribBinding
中的顶点缓冲绑定点。最后,没有glBindVertexBuffer
调用,绑定到哪个缓冲区bindingPoint1
和bindingPoint2
?我试图理解ARB\u vertex\u attrib\u绑定扩展,但我仍然不理解这段代码
对我来说,glvertexattribbointer
似乎不正确,因为顶点属性位置不正确,glVertexAttribBinding
也不正确,因为没有顶点绑定点绑定到顶点缓冲区。
谁能给我解释一下,这是怎么回事 您正在阅读的是一个测试,用于验证OpenGL驱动程序是否正确实现了该功能。这并不是一个合理代码的例子。它基本上是在测试一个极端情况,一个正常的代码通常不会触发的情况 顶点属性绑定有效地重新定义了
glVertexAttribPointer
的含义。此测试旨在验证驱动程序是否正确实现了重新定义的glvertexattributepointer
同样,您不应该编写这样混合这两者的代码。但是规范允许这样做,所以一个好的测试人员应该验证实现是否完成了它的工作
因此,对glvertexattributepointer
的两个调用有效地执行以下操作:
glVertexAttribFormat(bindingPoint1, ..., 0);
glBindVertexBuffer(bindingPoint1, m_buffer, 0, (glw::GLsizei)(2 * sizeof(tcu::Vec4)));
glVertexAttribBinding(bindingPoint1, bindingPoint1);
glVertexAttribFormat(bindingPoint2, ..., 0);
glBindVertexBuffer(bindingPoint2, m_buffer, sizeof(tcu::Vec4), (glw::GLsizei)(2 * sizeof(tcu::Vec4)));
glVertexAttribBinding(bindingPoint2, bindingPoint2);
因此,这将设置两个属性以及两个缓冲区绑定。但着色器从未实际使用这些属性
后面的代码设置了另外两个属性,但是:
gl.glVertexAttribBinding(positionLoc, bindingPoint1);
gl.glVertexAttribBinding(colorLoc, bindingPoint2);
意味着它们从先前建立的绑定点获取属性和顶点数据。因此VS实际使用的两个属性从缓冲区绑定点bindingPoint1
和bindingPoint2
获取缓冲区数据。另外两个属性也从相同的绑定点获取数据,它们不被VS使用,因此不相关
现在让我再次强调,在实际代码中,您永远不应该这样做。选择一种API风格并坚持下去。否则,请在同一VAO中选择一个API样式。您正在阅读的是一个测试,用于验证OpenGL驱动程序是否正确实现了该功能。这并不是一个合理代码的例子。它基本上是在测试一个极端情况,一个正常的代码通常不会触发的情况 顶点属性绑定有效地重新定义了
glVertexAttribPointer
的含义。此测试旨在验证驱动程序是否正确实现了重新定义的glvertexattributepointer
同样,您不应该编写这样混合这两者的代码。但是规范允许这样做,所以一个好的测试人员应该验证实现是否完成了它的工作
因此,对glvertexattributepointer
的两个调用有效地执行以下操作:
glVertexAttribFormat(bindingPoint1, ..., 0);
glBindVertexBuffer(bindingPoint1, m_buffer, 0, (glw::GLsizei)(2 * sizeof(tcu::Vec4)));
glVertexAttribBinding(bindingPoint1, bindingPoint1);
glVertexAttribFormat(bindingPoint2, ..., 0);
glBindVertexBuffer(bindingPoint2, m_buffer, sizeof(tcu::Vec4), (glw::GLsizei)(2 * sizeof(tcu::Vec4)));
glVertexAttribBinding(bindingPoint2, bindingPoint2);
因此,这将设置两个属性以及两个缓冲区绑定。但着色器从未实际使用这些属性
后面的代码设置了另外两个属性,但是:
gl.glVertexAttribBinding(positionLoc, bindingPoint1);
gl.glVertexAttribBinding(colorLoc, bindingPoint2);
意味着它们从先前建立的绑定点获取属性和顶点数据。因此VS实际使用的两个属性从缓冲区绑定点bindingPoint1
和bindingPoint2
获取缓冲区数据。另外两个属性也从相同的绑定点获取数据,它们不被VS使用,因此不相关
现在让我再次强调,在实际代码中,您永远不应该这样做。选择一种API风格并坚持下去。否则,请在同一VAO中选择一种API样式