2011-06-21 11 views
17

Tengo vértice de paso y sombreadores de fragmentos.¿Cuál es la relación entre gl_Color y gl_FrontColor en sombreadores de vértices y fragmentos

vértice shader

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

fragmento shader

void main(void) 
{ 
    gl_FragColor = gl_Color; 
} 

Aquellos producen representación vacío (negro no color de fondo como glClearBuffer hace).

Si modifico el sombreado de vértices para establecer el gl_FrontColor en gl_Color, se renderiza el buffer de OpenGl intacto ... con el comportamiento esperado de los sombreadores de paso.

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

Estoy confundido, cómo la configuración de la gl_FrontColor en el vertex shader puede cambiar el valor de la gl_Color en el fragmento? Lo que me estoy perdiendo?

Respuesta

32

gl_Color significa diferentes cosas en diferentes lugares.

En el sombreado de vértices, gl_Color representa el atributo de color primario por vértice pasado por el usuario. Esto se establece usando glColor* llamadas o datos de matriz obtenidos por glColorPointer.

En el sombreador de fragmentos, gl_Color representa el color interpolado para el revestimiento del triángulo que se está renderizando. Recuerde que los triángulos tienen una cara frontal y una cara posterior. Si habilita el descarte de caras, entonces no se representan todas las caras de un tipo u otro (o ambos). Sin embargo, si desactiva el sacrificio facial, se renderizarán ambos lados.

A menudo es útil tener diferentes valores de salida por vértice basados ​​en la orientación particular del triángulo. El color primario tiene un color frontal y un color posterior, que representa el color de los triángulos que miran hacia el frente y los triángulos que miran hacia atrás. Las salidas del sombreador de vértices para estos son gl_FrontColor y gl_BackColor.

Si está haciendo una representación a dos caras, tendrá que establecer estos dos valores para que la entrada gl_Color del sombreador de fragmentos tenga algún significado. Si solo está haciendo renderizado frontal, solo necesita configurar gl_FrontColor.

+0

¡Esa es una buena explicación! – vrince

0

gl_Color es el color que pasaste en tu origen a los vértices, por lo que es un atributo. gl_FrontColor (y también BackColor) son variaciones que configuran el gl_Color en el fragmentador dependiendo del lado de la primitiva que veas. Entonces, si ve el frente gl_Color será igual a gl_FrontColor ...

+3

Por cierto, los pixel-shaders están en DirectX. OpenGL los llama FragmentShaders, que también es más preciso. – Nobody

Cuestiones relacionadas