0

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

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

glEnableVertexAttribArray
glVertexAttribPointer
glGetAttribLocation
glBindAttribLocation

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

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

有没有遗漏的步骤?

4

2 回答 2

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 。

于 2012-04-21T10:00:01.097 回答
0

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

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

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

于 2012-04-21T10:54:23.363 回答