MODIFIER: Ceci est un doublon dune question du débordement de pile: https://stackoverflow.com/questions/9222217/how-does-the-fragment-shader-know-what-variable-to-use-for-the-color-of-a-pixel
Si vous voulez envoyer une valeur du vertex shader au fragment shader, le vertex shader doit déclarer une variable comme out
, le fragment shader doit déclarer une autre variable comme in
et les deux variables doivent avoir leurs noms et types égaux. Mais cela ne se produit pas lorsque vous souhaitez envoyer la valeur de couleur du fragment shader. En fait, vous pouvez appeler la variable de sortie comme vous le souhaitez. Pourquoi? Dans lancienne version, il y avait une variable appelée gl_FragColor
Comment le programme lie votre variable de fragment de sortie avec gl_FragColor?
Commentaires
- Discussion sur les méta sur les doublons intersites et sils posent un problème
- Si vous avez des questions supplémentaires, veuillez les publier en tant que nouvelles questions plutôt que de les modifier dans une question existante. comment les réponses à des questions distinctes peuvent être comparées indépendamment. Vous pouvez toujours inclure des liens entre les questions si elles sont liées.
Answer
Cela fonctionne presque exactement de la même manière que les entrées de vertex shader.
Dans les vertex shaders, vous avez des entrées. Et ces entrées représentent les indices dattributs de vertex, les nombres que vous passez à glVertexAttribPointer
et
et ainsi de suite. Vous définissez quelle entrée tire de quel attribut. Dans GLSL 3.30, vous utilisez cette syntaxe:
layout(location = 2) in color;
Ceci définit lentrée du nuanceur de vertex color
pour quelle provienne de lattribut location 2. Avant 3.30 (ou sans ARB_explicit_attrib_location), vous devrez soit le configurer explicitement avec glBindAttrbLocation
avant lier ou interroger le programme pour lindex dattributs avec glGetAttribLocation
. Si vous ne fournissez pas explicitement un emplacement dattribut, GLSL attribuera un emplacement arbitrairement (cest-à-dire: dune manière définie par limplémentation).
Le définir dans le shader est presque toujours la meilleure option.
Dans tous les cas, les résultats des shaders de fragments fonctionnent presque exactement de la même manière. Les shaders de fragments peuvent écrire dans plusieurs couleurs de sortie , qui eux-mêmes sont mappés à plusieurs tampons dans le framebuffer . Par conséquent, vous devez indiquer quelle sortie va vers quelle couleur de sortie de fragment.
Ceci Le processus commence par la valeur de lemplacement de sortie du fragment. Il est défini de manière très similaire aux emplacements dentrée du vertex shader:
layout(location = 1) out secColor;
Il existe également les fonctions API glBindFragDataLocation
et glGetFragDataLocation
, qui sont analogues à glBindAttribLocation
et glGetAttribLocation
.
Si vous ne faites aucune assi gnements, les implémentations attribueront généralement lune de vos variables de sortie à lemplacement 0. Cependant, la norme OpenGL ne requiert pas ce comportement, vous ne devriez donc pas en dépendre non plus.