GLSL 效果示例
卡通明暗分层:用三档色块表现球面光照
移动光源,三段明暗边界移动;可与连续光照对照。
在线示例
修改右侧代码,左侧预览会实时更新。
观察什么
移动光源,三段明暗边界移动;可与连续光照对照。
实现原理
先计算连续的漫反射项,再对其分段取整。分层发生在光照强度上,所以边界会跟着光源移动。
找到控制效果的代码
float r=dot(p,p);if(r<.5){vec3 n=normalize(vec3(p,sqrt(.5-r)));float l=max(dot(n,normalize(vec3(cos(u_time*.4),.5,1.))),0.);float band=floor(l*(2.+floor(u_parameter*4.)))/(2.+floor(u_parameter*4.));c=vec3(.2,.65,.95)*(.2+.8*band);}
动手修改
把 u_parameter 从 0 调到 1,除数 2.+floor(u_parameter*4.) 会从 2 变为 6。受光球面上会出现更多亮度台阶,边界仍跟随运动光源。
调试与成本
着色器先算球面法线,再量化漫反射值 l,不读取纹理。把 floor(l*(2.+floor(u_parameter*4.)))/(2.+floor(u_parameter*4.)) 换成 l,可恢复连续明暗,单独检查量化步骤的作用。