在顶点和片段着色器中gl_Color和gl_FrontColor之间的关系是什么

时间:2011-06-21 18:26:00

标签: opengl shader pixel-shader vertex-shader

我有传递顶点和片段着色器。

顶点着色器

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

片段着色器

void main(void)
{
    gl_FragColor = gl_Color;
}

那些产生空渲染(黑色不是像glClearBuffer那样的背景颜色)。

如果我修改顶点着色器以将gl_FrontColor设置为gl_Color,它会渲染未触及的OpenGl缓冲区...具有直通着色器的预期行为。

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

我很困惑,如何设置顶点着色器中的gl_FrontColor可以更改片段1中gl_Color的值?我缺少什么?

2 个答案:

答案 0 :(得分:33)

gl_Color在不同的地方意味着不同的事情。

在顶点着色器中,gl_Color表示用户传递的主要每顶点颜色属性。这是使用glColor*调用或glColorPointer提取的数组数据设置的。

在片段着色器中,gl_Color表示正在渲染的三角形的面对的插值颜色。请记住,三角形有正面和背面。如果启用面部剔除,则不会呈现一种或另一种(或两者)的所有面。但是,如果关闭面部剔除,则会渲染两面。

根据三角形的特定面,有不同的每顶点输出值通常很有用。主色具有正面颜色和背面颜色,表示前置三角形和后向三角形的颜色。这些的顶点着色器输出为gl_FrontColorgl_BackColor

如果您正在进行双面渲染,则需要设置这两个值,以便片段着色器的gl_Color输入表示任何内容。如果您只进行正面渲染,则只需设置gl_FrontColor

答案 1 :(得分:1)

gl_Color是您在源中传递给顶点的颜色,因此它是一个属性。 gl_FrontColor(以及BackColor)是变化,它根据您看到的基元的哪一侧设置片段着色器中的gl_Color。所以如果你看到前面的gl_Color将等于gl_FrontColor ...