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,可恢复连续明暗,单独检查量化步骤的作用。

用到的内置函数

一步步学会这个效果