I have pass-through vertex and fragment shaders.
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;
}
Those produce empty rendering (black not background color like glClearBuffer does).
If I modify the vertex shader to set the gl_FrontColor to gl_Color it does render untouched OpenGl buffer ... with is the expected behavior of pass-through shaders.
void main(void)
{
gl_FrontColor = gl_Color; //Added line
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
I am confused, how settings the gl_FrontColor in the vertex shader can change the value of the gl_Color in the fragment one ? What I am missing ?
gl_Color
means different things in different places.
In the vertex shader, gl_Color
represents the primary per-vertex color attribute passed by the user. This is set using glColor*
calls or array data fetched by glColorPointer
.
In the fragment shader, gl_Color
represents the interpolated color for the facing of the triangle being rendered. Remember that triangles have a front-face and a back-face. If you enable face culling, then all faces of one kind or the other (or both) are not rendered. However, if you turn off face culling, then both sides are rendered.
It is often useful to have different per-vertex output values based on the particular facing of the triangle. The primary color has a front color and a back color, representing the color for front-facing triangles and back-facing triangles. The vertex shader outputs for these are gl_FrontColor
and gl_BackColor
.
If you are doing two-sided rendering, you will need to set both of these values in order for the fragment shader's gl_Color
input to mean anything. If you are only doing front-face rendering, then you only need to set gl_FrontColor
.