在OpenGL ES中使用glBindAttribLocation函数

时间:2011-08-01 12:03:39

标签: iphone opengl-es glsl opengl-es-2.0

我没有在OpenGL ES 2.0中使用glBindAttribLocation函数

有人可以给我完整的背景吗?是否像

g_pLightDir = g_pEffect10->GetVariableByName( "g_LightDir" )->AsVector();
在DirectX 10中

?在各种网站上在线阅读,但无法使用此功能。需要帮助..

2 个答案:

答案 0 :(得分:25)

此函数允许您为用户定义的着色器属性指定属性索引(不是代码示例所示的统一),稍后在引用属性时使用该属性。

假设你有一个顶点着色器:

...
attribute vec4 vertex;     //or 'in vec4 vertex' in modern syntax
attribute vec3 normal;
...

然后,您可以使用

将索引绑定到这些变量
glBindAttribLocation(program, 0, "vertex");
glBindAttribLocation(program, 1, "normal");

您可以使用您喜欢的任何非负数(在很小的范围内)。然后,在引用这些属性时,您可以使用它们的索引,例如在glVertexAttribPointerglEnableVertexAttribArray个函数中。

但请记住,在链接程序之前必须调用glBindAttribLocation。你也可以省略它。然后,OpenGL会在链接期间自动将索引绑定到所有使用的属性,稍后可以glGetAttribLocation查询。但是使用glBindAttribLocation,您可以建立自己的属性索引语义并使它们保持一致。

较新的GLSL版本甚至允许您在着色器中指定属性索引(使用layout语法),无需glBindAttribLocationglGetAttribLocation,但我是不确定ES是否支持。

但我的答案并不比你看过的那些“各种”网站或任何好的OpenGL / GLSL书籍更能告诉你,所以如果你还没有得到它,请深入研究GLSL的基础知识。< / p>

答案 1 :(得分:0)

我从未使用Direct X,但glBindAttribLocation用于在着色器中定义属性的位置,例如在着色器中有此行:

attribute vec3 g_LightDir;

然后你可以使用glBindAttribLocation来设置那个vec3的位置,你必须在将顶点着色器附加到着色器程序之后但在链接它之前(或者你必须“重新链接”它)。如果您没有指定位置,编译器将为您执行此操作,您可以使用glGetAttribLocation查询位置。