GLSL 效果示例

交叉排线:用一层层笔触画出球体暗部

暗部叠加更多方向的线条,亮部保留纸色。

在线示例

修改右侧代码,左侧预览会实时更新。

观察什么

暗部叠加更多方向的线条,亮部保留纸色。

实现原理

较暗的光照区逐层加入更多方向的笔触。画的是线的覆盖率,不是把球体涂成几档灰色。

找到控制效果的代码

float r=dot(p,p),l=0.;if(r<.65){vec3 n=normalize(vec3(p,sqrt(.65-r)));l=max(dot(n,normalize(vec3(.7,.8,1.))),0.);}float h=1.-smoothstep(.03,.08,abs(sin((p.x+p.y)*80.)));float h2=1.-smoothstep(.03,.08,abs(sin((p.x-p.y)*80.)));float h3=1.-smoothstep(.03,.08,abs(sin(p.x*90.)));float ink=h*step(l,.8)+h2*step(l,.5)+h3*step(l,.25);c=mix(vec3(.94,.89,.75),vec3(.1,.08,.13),clamp(ink,0.,1.));

动手修改

把第一个光照阈值 step(l,.8) 改成 step(l,.95)。第一层斜线会延伸到球面更亮的区域,另外两层暗部线条仍保持原阈值。

调试与成本

着色器生成三层正弦线并叠加覆盖率,没有采样纸张图片。把 (p.x+p.y)*80. 与 (p.x-p.y)*80. 两处斜线频率都降到 40.,单个交叉点会更容易分辨。

用到的内置函数

一步步学会这个效果