EDIT: Esto es un duplicado de una pregunta del desbordamiento de pila: https://stackoverflow.com/questions/9222217/how-does-the-fragment-shader-know-what-variable-to-use-for-the-color-of-a-pixel
Si desea enviar un valor desde el sombreador de vértices al sombreador de fragmentos, el sombreador de vértices debe declarar una variable como out
, el sombreador de fragmentos debe declarar otra variable como in
y ambas variables deben tener el mismo nombre y tipo. Pero esto no sucede cuando desea enviar el valor de color desde el sombreador de fragmentos. De hecho, puede llamar a la variable de salida como desee. ¿Por qué? En la versión anterior había una variable llamada gl_FragColor
¿Cómo vincula el programa su variable de fragmento de salida con gl_FragColor?
Comentarios
- Discusión en meta sobre duplicados entre sitios y si son un problema
- Si tiene preguntas adicionales, publíquelas como preguntas nuevas en lugar de editarlas en una existente. Esto la forma en que las respuestas a preguntas independientes se pueden comparar de forma independiente. Aún puede incluir vínculos entre las preguntas si están relacionadas.
Responder
Funciona casi exactamente de la misma manera que las entradas del sombreador de vértices.
En los sombreadores de vértices, tiene entradas. Y estas entradas representan índices de atributos de vértice, los números que pasa a glVertexAttribPointer
y
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 del atributo location 2. Antes de las 3.30 (o sin ARB_explicit_attrib_location), tendría que configurar esto explícitamente con glBindAttrbLocation
antes 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 arbitrariamente (es decir, de una manera definida por la implementación).
Configurarlo en el sombreador casi siempre es 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 se asignan a búferes múltiples en el búfer de fotogramas . Por lo tanto, debe indicar qué salida va a qué color de salida de fragmento.
Este El proceso comienza con el valor de ubicación de salida del fragmento. Se establece 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 de API glBindFragDataLocation
y glGetFragDataLocation
, que son análogos a glBindAttribLocation
y glGetAttribLocation
.
Si no realiza ninguna tarea explícita Por lo general, las implementaciones 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.