Al configurar ubicaciones de atributos para un programa de sombreado OpenGL, se enfrenta a dos opciones:
glBindAttribLocation () antes de vincular para definir explícitamente la ubicación de un atributo.
o
glGetAttribLocation () después de vincular para obtener una ubicación de atributo asignada automáticamente.
¿Cuál es la utilidad de usar uno sobre el otro?
¿Y cuál, si corresponde, se prefiere en la práctica?
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 ...Respuestas:
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:
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 :
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:
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:
Pero esto no está presente en el lenguaje de sombreado GLSL ES.
fuente
Otra respuesta aquí es que glGetAttribLocation devuelve datos a la persona que llama, lo que significa que implícitamente requiere un flujo de canalización. Si lo llama justo después de compilar su programa, esencialmente está forzando la compilación asincrónica a que se produzca de forma sincrónica.
fuente
glGetUniformLocation
todos modos; ¿Sigue siendo relevante esta consideración en particular?La tercera opción, es decir,
layout(location=0) in vec4 position;
en el código de sombreado, ahora está disponible en OpenGL ES 3.0 / GLSL 300 es. Sin embargo, solo para las variables de entrada del sombreador de vértices.fuente