在我的例子中给出了这个数组:
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/8DkBfETn
答案 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;