2011-08-01 13 views
9

no consigo el uso de glBindAttribLocation función en OpenGL ES 2.0Uso de la función glBindAttribLocation en OpenGL ES

Puede alguien dar el contexto completo? ¿Es algo así como

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

en DirectX 10? Lea en línea en varios sitios, pero no podría obtener el uso de esta función. Ayuda necesaria ...

+1

¿Lo ha descubierto usted mismo y se olvidó de su pregunta o todavía tiene algunas discromías que puede querer preguntar? –

Respuesta

25

Esta función le permite especificar un índice de atributo para un atributo de sombreador definido por el usuario (no para un uniforme, como sugiere el ejemplo del código), que luego utilizará al referirse al atributo.

Digamos que tiene un vertex shader:

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

A continuación, puede obligar a los índices a esas variables, con

glBindAttribLocation(program, 0, "vertex"); 
glBindAttribLocation(program, 1, "normal"); 

Usted puede usar cualquier número no negativo te gusta (en un pequeño rango) Luego, al referirse a estos atributos, usa sus índices, p. en glVertexAttribPointer o glEnableVertexAttribArray funciones.

Pero tenga en cuenta que debe llamarse al glBindAttribLocation antes de vincular el programa. También puedes omitirlo. Luego, OpenGL vincula automáticamente los índices a todos los atributos utilizados durante la vinculación, que luego se puede consultar por glGetAttribLocation. Pero con glBindAttribLocation puede establecer su propia semántica de índice de atributos y mantenerlos consistentes.

Las versiones más recientes de GLSL incluso le permiten especificar los índices de atributos dentro del shader (utilizando la sintaxis layout), eliminando la necesidad de que sea glBindAttribLocation o glGetAttribLocation, pero no estoy seguro de si esto es compatible con ES.

Pero mi respuesta no dice más que esos "varios" sitios que miraste o cualquier buen libro de OpenGL/GLSL, así que si aún no lo entiendes, ahonda un poco más en los conceptos básicos de GLSL.

+0

Si no usa glBindAttribLocation, ¿hay un pedido predeterminado garantizado como 0,1,2 ... o se necesita una llamada a glGetAttribLocation en este caso? – Jochen

+0

@Jochen Si no usas 'glBindAttribLocation' nada está garantizado y necesitas' glGetAttribLocation'. Si bien un controlador razonable probablemente usaría los primeros índices consecutivos, nada le impide usar números arbitrarios. –

0

Nunca utilicé Direct X, pero glBindAttribLocation se utiliza para definir la ubicación para un atributo en su shader, supongamos que tiene esta fila en su shader:

attribute vec3 g_LightDir; 

continuación, puede utilizar glBindAttribLocation a establecer una ubicación para ese vec3, debe hacer esto después de haber adjuntado su vertex-shader a su programa shader pero antes de vincularlo (o tiene que "volver a vincularlo"). Si no especifica una ubicación, el compilador lo hará por usted y podrá consultar la ubicación con glGetAttribLocation.

Cuestiones relacionadas