我有传递顶点和片段着色器。
顶点着色器
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的值?我缺少什么?
答案 0 :(得分:33)
gl_Color
在不同的地方意味着不同的事情。
在顶点着色器中,gl_Color
表示用户传递的主要每顶点颜色属性。这是使用glColor*
调用或glColorPointer
提取的数组数据设置的。
在片段着色器中,gl_Color
表示正在渲染的三角形的面对的插值颜色。请记住,三角形有正面和背面。如果启用面部剔除,则不会呈现一种或另一种(或两者)的所有面。但是,如果关闭面部剔除,则会渲染两面。
根据三角形的特定面,有不同的每顶点输出值通常很有用。主色具有正面颜色和背面颜色,表示前置三角形和后向三角形的颜色。这些的顶点着色器输出为gl_FrontColor
和gl_BackColor
。
如果您正在进行双面渲染,则需要设置这两个值,以便片段着色器的gl_Color
输入表示任何内容。如果您只进行正面渲染,则只需设置gl_FrontColor
。
答案 1 :(得分:1)
gl_Color是您在源中传递给顶点的颜色,因此它是一个属性。 gl_FrontColor(以及BackColor)是变化,它根据您看到的基元的哪一侧设置片段着色器中的gl_Color。所以如果你看到前面的gl_Color将等于gl_FrontColor ...