2014-04-11 333 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