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.
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
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
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