GLSL 效果示例

圆形

用有向距离函数、length() 和 smoothstep() 画一个边缘干净、没有锯齿的圆。

在线示例

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

工作原理

每个像素都只问一个问题:我离中心有多远?length(p) 给出这个距离。减去半径之后,它就变成了有向距离:圆内是负数,正好在边上是 0,圆外是正数。

smoothstep(-px, px, d) 把这个距离变成 0 到 1 的遮罩。px 是一个像素的大小,所以边缘会在大约两个像素内渐变过去。这样就去掉了用 step() 硬切时出现的锯齿。

第一行把像素坐标换算到中心是 (0, 0)、画布短边从 -1 到 1 的范围。如果不除以短边,宽画布上的圆会被拉成椭圆。

试着改一改

修改效果
0.6 改成 0.3圆变小(半径是半高的 30%)
px 改成 0.2边缘变成柔和的光晕,而不是清晰的边
length(p) 改成 length(p * vec2(1.0, 2.0))变成上下压扁的椭圆
1.0 - smoothstep(...) 改成 smoothstep(...)颜色反过来:填充背景上挖出一个洞

用到的内置函数

一步步学会这个效果