2012-04-21 33 views
0

我想在一个固定的VBO数组之间切换着色器程序运行时。如何判断着色器的顶点属性?

我THIK我不需要比固定顶点以下功能更多属性的索引(我想0的位置,1纹理坐标)

glEnableVertexAttribArray 
glVertexAttribPointer 
glGetAttribLocation 
glBindAttribLocation 

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

有人可以告诉我一个简短的示例代码,它显示了上述函数的正确使用/执行顺序吗?

有没有缺失的步骤?

+3

-1:“有人可以给我看一个简短的示例代码,告诉我上述函数的正确使用/执行顺序吗?”这是一个可怕的问题。如果你不知道他们*做了什么*,你不知道这些功能进入的顺序的唯一方法。所以你需要问这些功能如何工作*;否则,你只是复制和粘贴编码。 – 2012-04-21 10:02:58

+0

@Nicol:像这样的东西 - http://www.opengl.org/sdk/docs/man/xhtml/glBindAttribLocation.xml - 确实不错,但告诉我关于执行顺序的事情没什么。 – Geri 2012-04-21 10:50:31

+0

我真的知道glBindAttribLocation是做什么的,但是当它连接我的程序后不能正常工作时,我不知道要去哪里。 – Geri 2012-04-21 10:51:25

回答

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。

+0

这有助于:http://samplecodebank.blogspot。COM/2011/05/glbindattriblocation-示例-C-C-objc.html – Geri 2012-04-21 10:02:28

0

作为医生说(http://www.opengl.org/sdk/docs/man/xhtml/glBindAttribLocation.xml):

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

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