圆角矩形

12 / 18
练习着色器中常用的数学基础积木。

圆角矩形的 SDF 只比普通矩形多一个参数——圆角半径 r:

下面拆解它。


和 sdBox 的区别

普通 sdBox 返回到矩形边界的距离,四个角是尖的。

sdRoundBox 在返回值里减去圆角半径 r:return … - r。这相当于把整个形状向外"膨胀"了 r,但四个角因为是用 length 算的,膨胀后自然就变成了圆弧——圆角出现了。

圆角半径越大,角就越圆;当 r 等于 b 的较小值时,就变成了椭圆或圆形。


参数是什么

调用 sdRoundBox(p, vec2(0.22, 0.14), 0.05):

  • p = 像素相对中心的位置(vUv - 0.5)
  • vec2(0.22, 0.14) = 矩形半宽 0.22、半高 0.14
  • 0.05 = 圆角半径

实际矩形宽 = 0.22 × 2 = 0.44,高 = 0.14 × 2 = 0.28,四角各有 0.05 的圆角。


试着改一改

改动效果
把 0.05 改成 0.14圆角很大,接近椭圆
把 0.05 改成 0.0等同于普通矩形(直角)
把 vec2(0.22, 0.14) 改成 vec2(0.2, 0.2)正方形,加圆角就是圆角正方形
把 0.01 改成 0.04边缘柔化更明显

练习

调用 sdRoundBox(p, vec2(0.22, 0.14), 0.05) 计算距离 d,让画面显示一个白色圆角矩形。

答案解析

sdRoundBox 的实现与 sdBox 几乎相同,只在最后减去圆角半径 r = 0.05。这使每个角的尖锐区域被削去一个半径为 0.05 的圆弧,形成平滑圆角。1.0 - smoothstep(0.0, 0.01, d) 把负值(内部)映射为白色,正值(外部)映射为黑色。

练习起始是 float d = 0.0,整个画面都被视为恰在边界处,效果不正确。换成 sdRoundBox 调用就能看到圆角矩形。

试着把圆角半径从 0.05 改成 0.12,看看角的圆弧弧度变化。

GLSL 代码编辑器

正确代码预览

当前代码预览