【问题标题】:glVertexAttribPointer index for texture co-ordinates in OpenGL ES 3.0OpenGL ES 3.0 中纹理坐标的 glVertexAttribPointer 索引
【发布时间】:2015-07-06 15:57:40
【问题描述】:

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

            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

【问题讨论】:

    标签: android opengl-es


    【解决方案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;
    

    【讨论】:

    • 我不太确定我是否理解。据我所知,glVertexAttributePointer 在我的示例中指定了第二列(如果从数组的元素 0 开始计数)。据我所知,您在这里谈论的任何功能都没有在示例中使用。有一些关于负责设置绑定位置的应用程序的信息,也许这就是正在发生的事情。我想也许您所说的是可以使用函数 glBindAttribLocation 手动应用绑定。
    • 位置 (3) 将是纹理坐标的第一列。之后我如何期望 glVertexAttributePointer 位置( 3 )实际上是说浮动缓冲区的索引 4 是纹理坐标数据的第二列而不是第一列。
    • 数字 ID 不是地址或列。它只是符号名称(文本字符串)到驱动程序其余部分可以理解的绑定位置(数字 ID)的简单映射。您有两个选项 - 您可以自己分配绑定值,也可以使用驱动程序提供的值。在您的情况下,您自己在着色器中定义值(答案已更新)。
    猜你喜欢
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多