逐像素、逐顶点光照差异
1、 逐像素(光照计算过程在片元着色器中完成)
顶点着色
varying vec4 diffuse,ambient;
varying vec3 normal,lightDir,viewDir;
void main()
{
normal = normalize(gl_NormalMatrix * gl_Normal);
lightDir = normalize(vec3(gl_LightSource[0].position));
//相机观察向量,顶点->人眼,用于计算镜面反射
viewDir = normalize(gl_LightSource[0].halfVector.xyz);
diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse;
ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
ambient += gl_LightModel.ambient * gl_FrontMaterial.ambient;//全局环境光
gl_Position = ftransform();
}
片元着色
varying vec4 diffuse,ambient;
varying vec3 normal,lightDir, viewDir;
void main()
{
vec3 n,viewVec;
float dfse,spec;
vec4 color = ambient;
n = normalize(normal);
dfse = max(dot(n,lightDir),0.0); //漫反射
if (dfse > 0.0) //没有漫反射,镜面反射也不存在
{
color += diffuse * dfse;
viewVec = normalize(viewDir);
spec = max(dot(n, viewVec),0.0); //镜面反射
color += gl_FrontMaterial.specular *
gl_LightSource[0].specular *
pow(spec, gl_FrontMaterial.shininess);
}
gl_FragColor = color;
}
2、 逐顶点光照(光照计算过程在顶点着色器中完成)
顶点着色
varying vec4 color;
void main()
{
vec4 diffuse,ambient;
vec3 normal,lightDir, viewDir;
normal = normalize(gl_NormalMatrix * gl_Normal);
lightDir = normalize(vec3(gl_LightSource[0].position));
//相机观察向量,顶点->人眼,用于计算镜面反射
viewDir = normalize(gl_LightSource[0].halfVector.xyz);
diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse;
ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
ambient += gl_LightModel.ambient * gl_FrontMaterial.ambient;//全局环境光
float dfse,spec;
color = ambient;
dfse = max(dot(normal,lightDir),0.0); //漫反射
if (dfse > 0.0) //没有漫反射,镜面反射也不存在
{
color += diffuse * dfse;
spec = max(dot(normal, viewDir),0.0); //镜面反射
color += gl_FrontMaterial.specular *
gl_LightSource[0].specular *
pow(spec, gl_FrontMaterial.shininess);
}
gl_Position = ftransform();
}
片元着色
varying vec4 color;
void main()
{
gl_FragColor = color;
}
效果对比图(逐像素、逐顶点)