我没有在OpenGL ES 2.0中使用glBindAttribLocation
函数
有人可以给我完整的背景吗?是否像
g_pLightDir = g_pEffect10->GetVariableByName( "g_LightDir" )->AsVector();
在DirectX 10中?在各种网站上在线阅读,但无法使用此功能。需要帮助..
答案 0 :(得分:25)
此函数允许您为用户定义的着色器属性指定属性索引(不是代码示例所示的统一),稍后在引用属性时使用该属性。
假设你有一个顶点着色器:
...
attribute vec4 vertex; //or 'in vec4 vertex' in modern syntax
attribute vec3 normal;
...
然后,您可以使用
将索引绑定到这些变量glBindAttribLocation(program, 0, "vertex");
glBindAttribLocation(program, 1, "normal");
您可以使用您喜欢的任何非负数(在很小的范围内)。然后,在引用这些属性时,您可以使用它们的索引,例如在glVertexAttribPointer
或glEnableVertexAttribArray
个函数中。
但请记住,在链接程序之前必须调用glBindAttribLocation
。你也可以省略它。然后,OpenGL会在链接期间自动将索引绑定到所有使用的属性,稍后可以glGetAttribLocation
查询。但是使用glBindAttribLocation
,您可以建立自己的属性索引语义并使它们保持一致。
较新的GLSL版本甚至允许您在着色器中指定属性索引(使用layout
语法),无需glBindAttribLocation
或glGetAttribLocation
,但我是不确定ES是否支持。
但我的答案并不比你看过的那些“各种”网站或任何好的OpenGL / GLSL书籍更能告诉你,所以如果你还没有得到它,请深入研究GLSL的基础知识。< / p>
答案 1 :(得分:0)
我从未使用Direct X,但glBindAttribLocation用于在着色器中定义属性的位置,例如在着色器中有此行:
attribute vec3 g_LightDir;
然后你可以使用glBindAttribLocation来设置那个vec3的位置,你必须在将顶点着色器附加到着色器程序之后但在链接它之前(或者你必须“重新链接”它)。如果您没有指定位置,编译器将为您执行此操作,您可以使用glGetAttribLocation查询位置。