Además, tenemos un gl_FragColor predefinido.
Empecemos por esto. No, no tienes el predefinido gl_FragColor
. Eso se eliminó del núcleo de OpenGL 3.1 y superior. A menos que esté usando compatibilidad (en cuyo caso, sus sombreadores 3.30 deberían decir #version 330 compatibility
en la parte superior), nunca debe usar esto.
Ahora, volvamos a las salidas del sombreador de fragmentos definidos por el usuario. Pero primero, una breve analogía.
¿Recuerdas cómo, en los sombreadores de vértices, tienes entradas? Y estas entradas representan vértice índices de atributos, los números se pasan a glVertexAttribPointer
y glEnableVertexAttribArray
y así sucesivamente? Usted configura qué entrada extrae de qué atributo. En GLSL 3.30, usa esta sintaxis:
layout(location = 2) in color;
Esto establece que la color
entrada del sombreador de vértices provenga de la ubicación del atributo 2. Antes de 3.30 (o sin ARB_explicit_attrib_location), tendría que configurar esto explícitamente glBindAttrbLocation
antes de vincular o consultar el programa para el índice de atributo con glGetAttribLocation
. Si no proporciona explícitamente una ubicación de atributo, GLSL asignará una ubicación de manera arbitraria (es decir, de una manera definida por la implementación).
Configurarlo en el sombreador es casi siempre la mejor opción.
En cualquier caso, las salidas del sombreador de fragmentos funcionan casi exactamente de la misma manera. Los sombreadores de fragmentos pueden escribir en varios colores de salida , que a su vez se asignan a varios búferes en el búfer de marco . Por lo tanto, debe indicar qué salida va a qué color de salida de fragmento.
Este proceso comienza con el valor de ubicación de salida del fragmento. Está configurado de manera muy similar a las ubicaciones de entrada del sombreador de vértices:
layout(location = 1) out secColor;
También están las funciones API glBindFragDataLocation
y glGetFragDataLocation
, que son análogas a glBindAttribLocation
y glGetAttribLocation
.
Si no realiza ninguna asignación explícita, las implementaciones generalmente asignarán una de sus variables de salida a la ubicación 0. Sin embargo, el estándar OpenGL no requiere este comportamiento, por lo que tampoco debe depender de él.
Ahora, para ser justos, su programa debería haber fallado al vincular cuando utilizó dos salidas que no obtuvieron diferentes ubicaciones de salida. Lo que probablemente sucedió fue que su compilador optimizó el que no escribió, por lo que se olvidó de él cuando llegó el momento de verificar los errores del vinculador.