Fragment shaders: variables de sortie
Question
La lecture de la spécification GLSL 1.40:
sorties Fragment ne peuvent être float, vecteurs à virgule flottante, signés ou entiers non signés ou des vecteurs de nombres entiers, ou des tableaux de tout ceux-ci. matrices et moules structures ne peuvent pas être sortie. Fragment sorties sont déclarées comme dans le les exemples suivants:
out vec4 FragmentColor; uint sur la luminosité;
La couleur de fragment est défini par écrit gl_FragColor ... est-ce pas? Quelqu'un pourrait effacer mes idées sur ces sorties? Puis-je écrire que « FragmentColor » de l'exemple pour déterminer la couleur du fragment? Puis-je Relire les (par exemple 'Luminosity')?
La solution
Votre exemple a 2 sorties. Ils ont des fentes de correspondants associés après FBO liaison du programme GLSL. Vous pouvez les rediriger en utilisant glBindFragDataLocation
.
Une fois que vous avez activé le shader et lié OIR, tout dépend d'un masque de tirage au sort, fixé par glDrawBuffers
. Par exemple, si vous avez passé GL_COLOR_ATTACHMENT0
et GL_COLOR_ATTACHMENT2
là, cela signifierait que l'indice de sortie 0 ira à la pièce jointe 0, et l'indice de sortie 1 irait à l'accessoire de couleur 2.
Autres conseils
La gl_FragColor variable de la production mondiale est dépréciée après la version 120 GLSL. Maintenant, vous devez lui donner un nom et le type par vous-même, comme dans votre exemple. En ce qui concerne plusieurs sorties, ce lien vous donne des informations sur la mise en correspondance: http://www.opengl.org/wiki/GLSL_Objects# Program_linking
(Et j'ai trouvé ce lien à: http: // www. opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=270999 )
Hope this helps! : D
Oups! Je vois que kvark a donné les informations pertinentes. Quoi qu'il en soit, peut-être vous avez quelque chose de mon texte aussi.
Je veux donner quelques exemples:
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;
}