2014-04-11 334 views
0

我想在我的程序中将我的小四角的角落变暗。我有以下的顶点着色器:GLSL - 设置顶点颜色

#version 130 

varying vec4 v_color; 
varying vec2 v_texcoord; 

void main() 
{ 
    v_color = gl_Color.rgba; 
    v_texcoord = gl_MultiTexCoord0.xy; 
    gl_FrontColor = vec4(v_color.r, v_color.g, v_color.b, 1.0f); 
    gl_Position = ftransform(); 
} 

我的片段着色器:

#version 130 

uniform sampler2D u_texture; 

varying vec4 v_color; 
varying vec2 v_texcoord; 

void main() 
{ 
    gl_FragColor = v_color * texture2D(u_texture, v_texcoord); 
} 

我读的地方,gl_FrontColor可用于“颜色”的顶点,但无论怎样我改变值,它似乎总是保持不变。

我的问题是,我可以使用什么函数来设置我的顶点的颜色?我希望顶点比四边形的其余部分稍暗,所以看上去有点“更好”。

回答

2

您输出到v_color(您的变化)和gl_FrontColor(GLSL内建)。但是,在片段着色器中,您只能使用v_color,因此gl_FrontColor中的任何内容都将被忽略。

您应该只使用其中的一种。无论

代替
// vertex 
#version 130 

#define SCALE_FACTOR 0.5 

varying vec4 v_color; 
varying vec2 v_texcoord; 

void main() 
{ 
    v_color = vec4(gl_Color.rgb * SCALE_FACTOR, 1.0); 
    v_texcoord = gl_MultiTexCoord0.xy; 
    gl_Position = ftransform(); 
} 

// fragment 
#version 130 

uniform sampler2D u_texture; 

varying vec4 v_color; 
varying vec2 v_texcoord; 

void main() 
{ 
    gl_FragColor = v_color * texture2D(u_texture, v_texcoord); 
} 

或在片段着色器使用顶点gl_FrontColorgl_Color,您v_color(并删除此不同,因为它不再需要)。

当然,顶点gl_Color属性来自glColorPointer, - 如果更改了颜色,它也会在着色器中更改。

+0

那么gl_Color在片段着色器中看起来如何? – user3316633

+0

我不明白你在问什么。 'gl_Color'在不同的地方有不同的含义。在顶点着色器中,它是来自'glColorPointer'的属性。在片段着色器中,根据多边形的方向,它可以根据“gl_FrontColor”或“gl_BackColor”(插值在顶点之间)进行变化。所以,基本上,你可以在片段着色器中使用它来代替'v_color',并且完全移除'v_color'。 – keltar