使用glBindAttribLocation功能我不明白在OpenGL ES 2.0的在OpenGL ES
使用glBindAttribLocation
功能可有一个人给我完整的上下文?是不是像
g_pLightDir = g_pEffect10->GetVariableByName("g_LightDir")->AsVector();
在DirectX 10?在各网站上在线阅读,但无法使用此功能。需要帮助..
使用glBindAttribLocation功能我不明白在OpenGL ES 2.0的在OpenGL ES
使用glBindAttribLocation
功能可有一个人给我完整的上下文?是不是像
g_pLightDir = g_pEffect10->GetVariableByName("g_LightDir")->AsVector();
在DirectX 10?在各网站上在线阅读,但无法使用此功能。需要帮助..
这个函数让我们为用户定义的着色器属性指定一个属性索引(不是为了你的代码示例建议的统一),稍后在引用属性时使用。
假设你有一个顶点着色器:
...
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的基础知识。
如果你不使用glBindAttribLocation是否有保证的默认排序,如0,1,2 ...或者是在这种情况下需要调用glGetAttribLocation? – Jochen
@Jochen如果您不使用'glBindAttribLocation',则无法保证,您需要'glGetAttribLocation'。尽管一个合理的驾驶员可能会使用第一个连续的指数,但是没有任何东西阻止他使用任意数字。 –
我从来没有使用过的Direct X,但glBindAttribLocation被用来定义你的着色器属性的位置,你在你的着色器有这样一行:
attribute vec3 g_LightDir;
然后你可以使用glBindAttribLocation设置位置对于那个vec3,你必须在将顶点着色器附加到着色器程序之后,但在链接它之前(或者你必须“重新链接”它)来做到这一点。如果你不指定一个位置,编译器会为你做,并且你可以用glGetAttribLocation查询位置。
你是否已经想出了自己,忘记了自己的问题,或者你还想问一些问题? –