EDIT: Questo è un duplicato di una domanda dallo stack overflow: https://stackoverflow.com/questions/9222217/how-does-the-fragment-shader-know-what-variable-to-use-for-the-color-of-a-pixel

Se vuoi inviare un valore da vertex shader a fragment shader, il vertex shader dovrebbe dichiarare una variabile come out, il fragment shader dovrebbe dichiarare laltra variabile come in ed entrambe le variabili devono avere nomi e tipi uguali. Ma questo non accade quando vuoi inviare il valore del colore dallo shader di frammento. In effetti, puoi chiamare la variabile di output come vuoi. Perché? Nella versione precedente cera una variabile chiamata gl_FragColor
In che modo il programma collega la variabile del frammento di output con gl_FragColor?

Commenti

Risposta

Funziona quasi esattamente allo stesso modo degli input del vertex shader.

Negli shader del vertice, hai degli input. Questi input rappresentano gli indici degli attributi dei vertici, i numeri che passi a glVertexAttribPointer e

e così via. Stabilisci quale input deve estrarre da quale attributo. In GLSL 3.30, usi questa sintassi:

layout(location = 2) in color; 

Questo imposta linput dello shader di vertice color in modo che provenga dallattributo posizione 2. Prima delle 3.30 (o senza ARB_explicit_attrib_location), dovresti impostarla esplicitamente con glBindAttrbLocation prima collegando o interrogando il programma per lindice dellattributo con glGetAttribLocation . Se non fornisci esplicitamente la posizione di un attributo, GLSL assegnerà una posizione arbitrariamente (cioè: in un modo definito dallimplementazione).

Limpostazione nello shader è quasi sempre lopzione migliore.

In ogni caso, gli output dello shader di frammento funzionano quasi esattamente allo stesso modo. Gli shader di frammento possono scrivere su più colori di output , che vengono mappati a più buffer nel framebuffer . Pertanto, è necessario indicare quale output va a quale colore di output del frammento.

Questo il processo inizia con il valore della posizione di output del frammento. È impostato in modo molto simile alle posizioni di input del vertex shader:

layout(location = 1) out secColor; 

Ci sono anche le funzioni API glBindFragDataLocation e glGetFragDataLocation , che sono analoghi a glBindAttribLocation e glGetAttribLocation.

Se non esegui assi espliciti gnments, le implementazioni di solito assegnano una delle tue variabili di output alla posizione 0. Tuttavia, lo standard OpenGL non richiede questo comportamento, quindi non dovresti nemmeno dipendere da esso.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *