glVertexAttribPointer OpenGL ES 3.0中纹理坐标的索引

时间:2015-07-03 18:28:07

标签: android opengl-es

在我的例子中给出了这个数组:

            private final float[] mVerticesData =
            {
                    -0.5f,  0.5f, 0.0f, // Position 0
                    0.0f,  0.0f,       // TexCoord 0
                    -0.5f, -0.5f, 0.0f, // Position 1
                    0.0f,  1.0f,       // TexCoord 1
                    0.5f, -0.5f, 0.0f, // Position 2
                    1.0f,  1.0f,       // TexCoord 2
                    0.5f,  0.5f, 0.0f, // Position 3
                    1.0f,  0.0f        // TexCoord 3
            };

在绘制循环中设置属性:

    //Load the vertices
    mVertices.position ( 0 );

    GLES30.glVertexAttribPointer ( 0, 3, GLES30.GL_FLOAT,
            false,
            5 * 4, mVertices );

    // Load the texture coordinate
    mVertices.position ( 3 );

    GLES30.glVertexAttribPointer ( 1, 2, GLES30.GL_FLOAT,
            false,
            5 * 4,
            mVertices );

顶点的加载对我来说似乎是完全符合逻辑的,位置为零,这是第一个元素 在缓冲区中,有三个元素构成顶点向量。然后步幅包括五个 元素三用于顶点向量,两用于纹理坐标,所以我取(5 * 4) 我认为转换为字节。

我的问题是关于纹理坐标的加载我希望看到的索引 glVertexAttributePointer设置为0但是设置为1.纹理坐标是否可能是 通过OpenGL向后阅读?如果不是为什么索引1?我看到它在这个配置中有效但我不理解1的索引。

我在pastebin中的代码:http://pastebin.com/0hxDS8Kt

我在pastebin中的着色器:http://pastebin.com/8DkBfETn

1 个答案:

答案 0 :(得分:1)

  

我期待看到要设置glVertexAttributePointer的索引   为0但是它设置为1.

该数字只是符号名称(文本字符串)到驱动程序其余部分理解的绑定位置(数字ID)的映射。除此之外,它实际上并没有任何语义含义(即它不是地址或指针编码)。

选项一:应用程序负责通过应用程序API调用或通过在着色器源中设置绑定位置来设置绑定位置(这是OpenGL ES 3.0中的新增功能)。

https://www.khronos.org/opengles/sdk/docs/man/xhtml/glBindAttribLocation.xml

选项二:应用程序可以使用驱动程序分配的绑定位置。不提供订单保证 - 您必须查询它:

https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetAttribLocation.xml

在您的情况下,您将使用以下代码序列在着色器中定义绑定值:

layout(location = 0) in vec4 a_position;          
layout(location = 1) in vec2 a_texCoord;