21

我有直通顶点和片段着色器。

顶点着色器

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 设置如何改变片段一中 gl_Color 的值?我错过了什么?

4

2 回答 2

36

gl_Color在不同的地方有不同的意思。

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

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

根据三角形的特定面,具有不同的每个顶点输出值通常很有用。原色有正面颜色和背面颜色,分别代表正面三角形和背面三角形的颜色。这些的顶点着色器输出是gl_FrontColorgl_BackColor

如果您正在进行双面渲染,则需要设置这两个值才能使片段着色器的gl_Color输入有意义。如果你只是做正面渲染,那么你只需要设置gl_FrontColor.

于 2011-06-21T18:40:56.163 回答
2

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

于 2011-06-21T18:31:03.430 回答