Quelle est la relation entre la couleur gl et la couleur frontale gl dans le vertex et les shaders de fragment

j'ai des vertex de passage et des shaders de fragment.

vertex shader

void main(void)
{
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

fragment shader

void main(void)
{
    gl_FragColor = gl_Color;
}

ceux qui produisent le rendu vide (noir pas la couleur de fond comme glClearBuffer fait).

si je modifie le shader du vertex pour définir le gl_FrontColor à gl_Color, cela rend le tampon OpenGl intact ... avec est le comportement attendu des shaders de passage.

void main(void)
{
    gl_FrontColor = gl_Color; //Added line
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

je suis confus, comment paramétrer le gl_FrontColor dans le vertex shader peut changer la valeur du gl_Color dans le fragment un ? Ce que je suis absent ?

18
demandé sur vrince 2011-06-21 22:26:00

2 réponses

gl_Color signifie des choses différentes à des endroits différents.

Dans le vertex shader, gl_Color représente l'attribut primaire de couleur par Sommet transmis par l'utilisateur. Il est défini à l'aide de glColor* appels ou un tableau de données extraites par glColorPointer.

dans le fragment shader,gl_Color représente la couleur interpolée pour le face du triangle Rendu. Rappelez-vous que les triangles ont une face avant et une face arrière. Si vous activez l'abattage des visages, alors tous les visages d'un seul type ou l'autre (ou les deux) ne sont pas rendus. Cependant, si vous désactivez l'abattage face, alors les deux côtés sont rendus.

il est souvent utile d'avoir différentes valeurs de sortie per-sommet basées sur la face particulière du triangle. La couleur principale a une couleur avant et une couleur arrière, représentant la couleur pour les triangles faisant face à l'avant et les triangles faisant face à l'arrière. Les sorties du vertex shader pour ceux-ci sont gl_FrontColor et gl_BackColor.

si vous faites du rendu recto-verso, vous aurez besoin pour définir ces deux valeurs dans l'ordre pour le fragment shader's gl_Color entrée de dire quoi que ce soit. Si vous ne faites que le rendu front-face, alors vous n'avez qu'à définir gl_FrontColor.

33
répondu Nicol Bolas 2011-06-21 18:40:56

gl_Color est la couleur que vous avez passée dans votre source aux sommets, donc c'est un attribut. gl_FrontColor (et aussi BackColor) sont des variables qui positionnent le gl_Color dans fragmentshader en fonction du côté de la primitive que vous voyez. Donc si vous voyez devant gl_Color sera égal à gl_FrontColor...

1
répondu Nobody 2011-06-21 18:31:03