读取一个模型到节点node,然后想对node施加一些特效,这时可以只使用片段着色器 其中: gl_Color表示固定管线计算出来的颜色,包含光照效果 gl_TexCoord[0]表示纹理坐标 uniform sampler2D tex;//tex可以随便命名,如果只有一张纹理 void main() { //模型顶点颜色 vec4 c0=gl_Color; //如果有纹理的话,获取纹理颜色 vec4 c1 = texture2D(tex,gl_TexCoord[0].st); //混合一下 vec4 c=(c0+c1)/2; //黑白特效 float grey = 0.3*c.r+0.59*c.g+0.11*c.b; c.r=grey*grey; c.g=grey*grey; c.b=grey*grey; gl_FragColor=c; } 顶点着色器: void main() { gl_TexCoord[0]=gl_MultiTextCoord0;//纹理坐标 gl_FrontColor = gl_Color;//直接获取顶点颜色,没有进行光照计算 gl_Position = ftransform();//等价于gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; } 片元着色器: void main() { gl_FragColor = gl_Color; } 注意两个gl_Color属性并不相同。 OpenGL程序使用glColor函数后,将颜色值以attribute gl_Color的形式传给了Vertex Shader, Vertext Shader接受到后开始计算gl_FontColor和gl_BackColor,而在Fragment Shader 则会接受到一个由FontColor和BackColor插值计算出来的varying gl_Color (注意:该gl_Color与Vertex Shader当中的不同),因而可以基于gl_Color开始计算gl_FragColor attribute vec4 gl_Color; varying vec4 gl_FrontColor; // writable on the vertex shader varying vec4 gl_BackColor; // writable on the vertex shader varying vec4 gl_Color; // readable on the fragment shader