2011-08-01 69 views
9

使用glBindAttribLocation功能我不明白在OpenGL ES 2.0的在OpenGL ES

使用glBindAttribLocation功能可有一个人给我完整的上下文?是不是像

g_pLightDir = g_pEffect10->GetVariableByName("g_LightDir")->AsVector(); 

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

+1

你是否已经想出了自己,忘记了自己的问题,或者你还想问一些问题? –

回答

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的基础知识。

+0

如果你不使用glBindAttribLocation是否有保证的默认排序,如0,1,2 ...或者是在这种情况下需要调用glGetAttribLocation? – Jochen

+0

@Jochen如果您不使用'glBindAttribLocation',则无法保证,您需要'glGetAttribLocation'。尽管一个合理的驾驶员可能会使用第一个连续的指数,但是没有任何东西阻止他使用任意数字。 –

0

我从来没有使用过的Direct X,但glBindAttribLocation被用来定义你的着色器属性的位置,你在你的着色器有这样一行:

attribute vec3 g_LightDir; 

然后你可以使用glBindAttribLocation设置位置对于那个vec3,你必须在将顶点着色器附加到着色器程序之后,但在链接它之前(或者你必须“重新链接”它)来做到这一点。如果你不指定一个位置,编译器会为你做,并且你可以用glGetAttribLocation查询位置。