Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl ARB_顶点_属性_绑定测试用例理解_Opengl_Opengl Es - Fatal编程技术网

Opengl ARB_顶点_属性_绑定测试用例理解

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

我正在调查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, 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样式