我想在着色器程序运行时之间切换,使用固定的VBO数组。
我认为我只需要以下具有固定顶点属性索引的函数(我希望0代表位置,1代表纹理坐标)
glEnableVertexAttribArray
glVertexAttribPointer
glGetAttribLocation
glBindAttribLocation
我已将所有内容连接起来,但没有任何内容吸引到FBO。 如果我使用从程序中找到的顶点属性索引(在glVertexAttribPointer中),那么它工作正常,但我不能将它与固定属性索引一起使用。
有人可以向我展示一个简短的示例代码,向我展示上述函数的正确用法/执行顺序吗?
有没有遗漏的步骤?
答案 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顶点 使用此命令的属性,因为它们在自动绑定时 需要。 程序对象之后发生的任何属性绑定 已联系不会生效直到下一次该程序 对象是链接的。