shader Fragment: variabili di uscita
Domanda
La lettura della specifica GLSL 1.40:
uscite frammento può essere solo galleggiante, vettori in virgola mobile, firmato o interi o vettori intero senza segno, o array di qualunque esse. matrici e strutture non possono essere emessi. Frammento uscite sono dichiarati nel seguenti esempi:
fuori vec4 FragmentColor; out uint Luminosità;
Il colore frammento è definita la scrittura gl_FragColor ... è giusto? Qualcuno potrebbe chiarire le mie idee su queste uscite? Posso scrivere solo 'FragmentColor' l'esempio per determinare il colore frammento? Posso leggere indietro ( 'Luminosità' per esempio)?
Soluzione
Il vostro esempio dispone di 2 uscite. Hanno slot FBO corrispondenti associati dopo il programma GLSL linking. È possibile reindirizzare utilizzando glBindFragDataLocation
.
Una volta attivato lo shader e FBO legato, tutto dipende da una maschera di pareggio, fissato dalla glDrawBuffers
. Ad esempio, se hai superato GL_COLOR_ATTACHMENT0
e GL_COLOR_ATTACHMENT2
lì, ciò significherebbe che indice della produzione 0 andranno l'allegato 0, e indice di uscita 1 sarebbe andato al fissaggio del colore 2.
Altri suggerimenti
Il gl_FragColor variabile di uscita globale è deprecato dopo GLSL versione 120. Ora dovete dargli un nome e il tipo da soli, come nel tuo esempio. Per quanto riguarda più uscite, questo link fornisce informazioni sulla mappatura: http://www.opengl.org/wiki/GLSL_Objects# Program_linking
(E ho scoperto che puntano a: http: // www. opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=270999 )
Spero che questo aiuti! : D
Ops! Vedo che kvark ha dato le informazioni pertinenti. In ogni caso, forse hai qualcosa di mio testo troppo.
voglio dare alcuni esempi:
void add(in float a, in float b, out float c)
{
//you can not use c here. only set value
//changing values of a and b does not change anything.
c = a + b;
}
void getColor(out float r, out float g, out float b)
{
//you can not use r, g, b here. only set value
r = gl_FragColor.r;
g = gl_FragColor.g;
b = gl_FragColor.b;
}
void amplify(inout vec4 pixelColor, in value)
{
//inout is like a reference
pixelColor = pixelColor * value;
}