Comment vertex shader transmettre les informations de couleur de fragment shader?
Dans un simple hello world programme OpenGL, qui dessine simplement statique triangle sur la fenêtre,
lorsque j'ai mis les 3 sommets du triangle pour le rouge, le vert et le bleu, le triangle est rempli avec un dégradé.
Mais quand j'utilise les shaders comme ceci:
Vertex Shader:
attribute vec4 aVertex;
attribute vec4 aColor;
varying vec4 vColor;
void main(void) {
gl_Position = gl_ModelViewMatrix * gl_ProjectionMatrix * aVertex;
vColor = aColor;
}
où les attributs aVertex
et aColor
vient d'un vertex buffer, transmis par le biais d'un appel de glVertexAttribPointer
.
Fragment Shader:
varying vec4 vColor;
void main(void) {
gl_FragColor = vColor;
}
Le triangle est toujours rempli avec un dégradé, et voici la question:
Si vertex shader est calculé par vertex, puis chaque instance de vColor
doit être attribué à la couleur d'un sommet. Et le sommet de la couleur doit être de couleur rouge, de vert ou de bleu, comme défini dans le vertex buffer.
Alors d'où vient le gradient de venir?
Ou, dans un autre mot, quand il est arrivé que dans la frag-shader, le vColor
s'avère être la couleur interpolée au lieu de le vertex?
- Voici plus d'infos pour le cas où la variable est à travers vec ou tapis de valeurs: gamedev.stackexchange.com/questions/139720/...
Vous devez vous connecter pour publier un commentaire.
"différentes" des variables dans le fragment shader avoir le résultat de l'interpolation linéaire entre les valeurs indiquées dans le vertex shader étape (basée sur la position relative de ce fragment entre les sommets).
Qui est, lorsque le rasterizer crache un fragment à un pixel, sa position est également donnée par rapport au triangle de sommets en coordonnées barycentriques. Ces coordonnées sont ensuite utilisées pour interpoler toutes les variables les variables dans le vertex shader. Dans la plupart des cas, c'est ce que vous voulez et de la vitesse acquise de ne pas l'interpolation est assez insignifiant ces jours-ci.
En utilisant le mot-clé "plat" va désactiver l'interpolation et l'utiliser à la place la valeur du premier sommet (je ne suis pas sûr à 100% "à plat" fonctionne avec des variables comme je l'ai activé le in/out avec les mots-clés des versions plus récentes de GLSL).
Sur une note de côté, j'ai trouvé cela particulièrement utile si le fragment a besoin de quelques valeurs de chacun des sommets. Dans ce cas, j'utilise
flat out myVertexValue[3]
dans la géométrie shader (par exemple ici).Le gradient vient de l'interpolation entre les couleurs de vertex qui se passe lorsque la variation de passer dans fragment shader.Si vous ne voulez pas pour interpoler les utiliser "à plat" mot clé au début de la variable .
Votre incompréhension provient probablement de l'absence de connaissances sur la façon de vertex et fragment étapes de travail.Ils fonctionnent différemment.Vertex shader est invoquée par sommet, tandis que le fragment de pixel par pixel.L'interpolation se fait par défaut comme il est nécessaire pour couvrir les fragments générés au cours de la pixellisation de la scène sur la zone définie par la primitive de l'assemblée.Et comme je l'ai dit, vous pouvez désactiver l'interpolation par "plat".Dans un tel cas, la couleur du premier sommet de l'attribut sera de définir la couleur d'ensemble de la forme.