高光
最终效果:
顶点着色器:
uniform vec3 uLightDir;
uniform vec3 uHighlightOffset;
uniform float uHightlightRange;
varying float weight1;
varying float weight2;
void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
vec3 lightDir = normalize(uLightDir);
vec3 objNor = normalize( normalMatrix* normal.xyz);
vec3 lightNor = normalize(normalMatrix* lightDir.xyz);
// 渐变纹理
weight1 = max( dot(lightNor, objNor)*0.5+0.5, 0.0 );
// 高光
vec3 offsetNor = normalize(objNor + uHighlightOffset);
float ret = max(dot(offsetNor, lightNor),0.);
if(ret > uHightlightRange) {
weight2 = 1.;
} else {
weight2 = 0.;
}
}
片元着色器:
uniform sampler2D t;
varying float weight1;
varying float weight2;
vec3 lerp (vec3 x, vec3 y, float t ) {
return (1. - t ) * x + t * y;
}
void main() {
vec2 newUV = vec2(weight1, 0.5);
vec4 color1 = texture2D(t,newUV);
vec3 heightColor = vec3(1., 1., 1.);
vec3 finalColor = lerp(color1.xyz, heightColor, pow(weight2, 2.));
gl_FragColor = vec4(finalColor, 1.);
}`;