2012-08-21 25 views
8

Duplicar posible:
Explicit vs Automatic attribute location binding for OpenGL shaders¿Por qué debería usar glBindAttribLocation?

En otra pregunta mía una de las respuestas indican que debo usar glBindAttribLocation y no permitir que el compilador de sombreado para asignar sus propios índices. Me pregunto por qué esta es una práctica recomendada, ¿qué ventajas tiene (o más bien, qué desventajas tiene el uso)?

Entiendo que si tengo varios programas que comparten atributos, esto tiene sentido, ya que puedo cambiar entre programas y no tener que restablecer esos atributos. Sin embargo, para los atributos que no se comparten, o si mis programas simplemente no usan dicho intercambio, no veo que sea necesario vincular explícitamente el índice.

+0

tl; dr no es gran cosa. Esta función _might_ puede ser útil, pero no es una gran cosa. No veo cómo podría ser una * práctica recomendada *, fuente? – Kos

+2

Usted ya lo ha respondido usted mismo. De modo que puede hacer que los programas compartan un par de atributos predefinidos y puede cambiar de programa o incluso usarlos para diferentes objetos, etc. En la práctica, esto me parece una gran ventaja. – Invalid

+0

No me molesté en usar 'glBindAttribLocation' en mi motor de gráficos, que funcionaba muy bien en Linux. Cuando viporté a windows, estaba usando mis normales como vértices: tenía que indicar explícitamente el orden de las variables mediante 'glBindAttribLocation' para ponerlo en funcionamiento ... – Jarrett

Respuesta

18

En primer lugar, no creo que sea una recomendación general utilizar enlaces explícitos a través de glBindAttribLocation​ en lugar de glGetAttribLocation. Dicho esto, estas son las razones principales por las que dejé de usar glGetAttribLocation:

En primer lugar, esto puede causar una sobrecarga innecesaria. Todo parece agradable y bueno, puedes usar nombres legibles en lugar de números. '¿Qué diablos es el atributo 7' frente a 'oh, a la derecha, atributo texture_coordinate': explicaré primero cuál es la posible sobrecarga y por qué esa última parte ni siquiera tiene sentido.

Si necesita la ubicación del atributo a menudo, la sobrecarga de llamar al glGetAttribLocation puede ser no despreciable, dependiendo del controlador. Entonces, para manejar el caso general, debe construir un sistema de almacenamiento en caché. Genial, ahí va mi método fácil y legible con nombres en vez de números, solo tuve que escribir bastante código de envoltura no trivial. Peor aún, debes tener cuidado de destruir el caché cuando el programa se vuelva inválido, es muy probable que lo hagas mal y termines con errores. Así que pasamos de 'buenos nombres legibles' a 'horrible buggy mess'.

Aún más, el argumento de 'buenos nombres legibles' es defectuoso. Usted puede hacer perfectamente algo como lo siguiente para las ubicaciones definidas en el shader sí:

const GLint vertex_loc_att = 0; 
const GLint texture_coord_att = 1; 
... 

O también se puede utilizar un contenedor asociativo como esto:

attribute_locations["vertex_location"] = 0; 
attribute_locations["texture_coordinate"] = 1; 
... 

Ésta también se puede combinar con glBindAttribLocation, acaba de hacer esto antes de la vinculación:

foreach name, location in attribute_locations 
{ 
    glBindAttribLocation(program_id, location, name); 
} 

Todavía muy fácil de leer, sin memoria caché dinámica necesaria, sólo algunas de las variables estáticas que incluso podría llegar optimizado de distancia.

Entonces, dígalo usted mismo: obviamente tiene ventajas cuando usa múltiples programas, no lo repetiré aquí, porque Kos explained that one in detail already. Simplemente responderé uno de sus argumentos:

Atributos que no necesitan compartir: Esto implica que también hay atributos que deben compartirse, para lo cual es una gran ventaja que use ubicaciones fijas. ¿Por qué mezclaría dos enfoques de administración de ubicación en una sola aplicación? Olvídate de un dolor de cabeza de mantenimiento y mantente con uno, aquí obviamente las ubicaciones predefinidas porque las necesitas para los atributos compartidos.

+4

¿Tiene sentido que también desee un' glBindUniformLocation ¿? Lo pregunto porque tu argumento también se aplica a él, pero esa función no está en el estándar. –

+1

La funcionalidad glBindUniformLocation se agregó en 4.3, mediante una declaración de diseño en el sombreador: http://www.opengl.org/wiki/Uniform_(GLSL)#Explicit_uniform_location –