Conozco una buena razón para preferir una definición de ubicación explícita .
Considere que mantiene sus datos de geometría en Vertex Array Objects. Para un objeto dado, crea un VAO de tal manera que los índices correspondan, por ejemplo:
- índice 0 : posiciones,
- índice 1 : normales,
- índice 2 : texcoords
Ahora considere que desea dibujar un objeto con dos sombreadores diferentes . Un sombreador requiere posición y datos normales como entrada, el otro - posiciones y coordenadas de textura .
Si compila esos sombreadores, notará que el primer sombreador esperará las posiciones en el índice de atributo 0 y las normales en 1. El otro esperaría posiciones en 0 pero las coordenadas de textura en 1.
Citando https://www.opengl.org/wiki/Vertex_Shader :
Asignación automática
Si ninguno de los dos métodos anteriores asigna una entrada a un índice de atributo, OpenGL asigna automáticamente el índice cuando se vincula el programa. El índice asignado es completamente arbitrario y puede ser diferente para los diferentes programas que están vinculados, incluso si usan exactamente el mismo código de sombreado de vértices.
Esto significa que no podrá utilizar su VAO con ambos sombreadores. En lugar de tener un VAO por, digamos, objeto, necesitaría, en el peor de los casos, un VAO separado por objeto por sombreador .
Forzar a los sombreadores a usar su propia convención de numeración de atributos a través de glBindAttribLocation
puede resolver este problema fácilmente; todo lo que necesita hacer es mantener una relación consistente entre los atributos y sus ID establecidos, y forzar a los sombreadores a usar esa convención al vincular.
(Eso no es realmente un gran problema si no usa VAO separados, pero aún así puede aclarar su código).
Por cierto:
Al configurar ubicaciones de atributos para un programa de sombreado OpenGL, se enfrenta a dos opciones
Hay una tercera opción en OpenGL / GLSL 3.3: Especifique la ubicación directamente en el código de sombreado . Se parece a esto:
layout(location=0) in vec4 position;
Pero esto no está presente en el lenguaje de sombreado GLSL ES.
glBindAttribLocation
en usarlo en mi motor gráfico, que funcionaba muy bien en Linux. Cuando porté a Windows, estaba usando mis normales como vértices; tuve que decirle explícitamente el orden de las variables en mi sombreador a travésglBindAttribLocation
para que funcionara ...