如何告知着色器的顶点属性?

时间:2012-04-21 09:37:45

标签: iphone opengl-es shader vertex

我想在着色器程序运行时之间切换,使用固定的VBO数组。

我认为我只需要以下具有固定顶点属性索引的函数(我希望0代表位置,1代表纹理坐标)

glEnableVertexAttribArray
glVertexAttribPointer
glGetAttribLocation
glBindAttribLocation

我已将所有内容连接起来,但没有任何内容吸引到FBO。 如果我使用从程序中找到的顶点属性索引(在glVertexAttribPointer中),那么它工作正常,但我不能将它与固定属性索引一起使用。

有人可以向我展示一个简短的示例代码,向我展示上述函数的正确用法/执行顺序吗?

有没有遗漏的步骤?

2 个答案:

答案 0 :(得分:3)

重点是:在链接程序之前必须调用glBindAttribLocation。

glBindAttribLocation(program, ATTRIBUTE_POSITION, "position");
glBindAttribLocation(program, ATTRIBUTE_TEXTURE_COORDINATES, "textureCoordinates");      
glLinkProgram(program);

然后您可以使用具有固定索引的属性数组函数,例如:

glEnableVertexAttribArray(ATTRIBUTE_POSITION);
glEnableVertexAttribArray(ATTRIBUTE_TEXTURE_COORDINATES);    
glVertexAttribPointer(ATTRIBUTE_POSITION, 2, GL_FLOAT, GL_FALSE, _positionStride, (void*)0);    
glVertexAttribPointer(ATTRIBUTE_TEXTURE_COORDINATES, 2, GL_FLOAT, GL_FALSE, _positionStride, (void*)_textureCoordinatesOffset);  

索引只是简单的整数,如:

//Vertex attributes.
enum 
{
    ATTRIBUTE_POSITION,            //0
    ATTRIBUTE_TEXTURE_COORDINATES  //1
};

现在有效。所以我不必在每次绘制调用之前调用glVertexAttribPointer。

答案 1 :(得分:0)

正如文档所述(http://www.opengl.org/sdk/docs/man/xhtml/glBindAttribLocation.xml):

  

a的属性变量name-to-generic属性索引绑定   程序对象可以随时通过调用显式分配   glBindAttribLocation。属性绑定直到生效才会生效   glLinkProgram被调用。程序对象链接后   成功地,通用属性的索引值保持固定   (并且可以查询它们的值),直到发生下一个链接命令。

     

不允许应用程序绑定任何标准OpenGL顶点   使用此命令的属性,因为它们在自动绑定时   需要。 程序对象之后发生的任何属性绑定   已联系不会生效直到下一次该程序   对象是链接的。