箱の SDF
code:glsl
float sdBox(vec3 p, vec3 b)
{
vec3 q = abs(p) - b;
return length(max(vec3(0.0), q)) + min(max(q.x,max(q.y,q.z)),0.0);
}
iq 神による解説
2次元の場合3つの領域を考える
0 < p.x かつ 0 < p.y の時は頂点との距離
0 < p.x かつ p.y < 0 の時は x 軸の面との距離
0 < p.y かつ p.x < 0 の時は y 軸の面との距離
length(max(0, abs(p) - r)) で四角形のすべての頂点の3つの領域の距離の計算を一気にできる内側にいるときに負の値を返すようにしたければ 0 と
min を取った後に一番デカい軸の値を足すmin(max(q.x, q.y),0.0) みたいな具合に3次元の時も次元が増えるだけですね