圆角矩形

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

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

下面拆解它。


和 sdBox 的区别

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

sdRoundBox 在返回值里减去圆角半径 rreturn … - 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 代码编辑器

正确代码预览

当前代码预览