朗伯余弦定律 #
用来计算某个角度所得到的亮度的多少,因为亮度不可能小于0(范围0-1),所以最小值为0
light = max(cos(theta), 0.0);
Shadertoy #
首先我们需要一张凹凸贴图(Bump Mapping),用来表示光照物体的各种细节/深度
代码部分:
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// Normalized pixel coordinates (from 0 to 1)
vec2 uv0 = fragCoord/iResolution.yy;
//光照的角度
vec2 lightDir = vec2(cos(iTime), sin(iTime));
//光源高度
float pitch = .5;
//朝光的方向偏移原来的uv
vec2 uv1 = uv0 + lightDir/iResolution.yy;
//获取偏移后的深度
float height0 = texture(iChannel0, uv0).r;
float height1 = texture(iChannel0, uv1).r;
//深度
float depth = .1;
//normal(法向量),根据两个不同的uv偏移的值算出两点相差的角度
float normal = atan(1./iResolution.y, (height1 - height0)*depth);
//光照强度
float lam = max(cos(normal - pitch), 0.);
// Time varying pixel color
// Output to screen
fragColor = vec4(vec3(lam), 1.0);
}
最终效果: