2025/08/04 10:55 Perfecting anti-aliasing on signed distance functions

ロボ子、今日はSDF(符号付き距離関数)を使ったアンチエイリアシングの話をするのじゃ!

SDFですか、博士。なんだか難しそうですね。

難しくないぞ!SDFは、ある点から特定の形までの距離を教えてくれる関数じゃ。しかも、形の内側か外側かで符号が変わるのがミソなのじゃ。

なるほど。それで、それがアンチエイリアシングとどう関係するんですか?

アンチエイリアシングでは、形状の境界を滑らかにする必要があるのじゃ。SDFを使うと、linearstep関数で簡単に滑らかなトランジションを作れるのじゃ!記事にも「線形ランプ(linearstep関数)は、aからbへの移行を直線的に行う」って書いてあるぞ。

linearstep関数ですか。初めて聞きました。

linearstepは、値を0から1に滑らかに変化させる関数じゃ。ランプの幅(w)がぼかしパラメータになるのじゃ。opacityは`h = clamp(0.5 + d/w, 0.0, 1.0)`で計算できるぞ。

ふむふむ。幅の値が重要なんですね。

そうじゃ!アンチエイリアシングではピクセルサイズを使うし、ブラーではユーザー入力や大きな値を使うのじゃ。2Dでピクセル解像度がある場合は、ピクセルサイズで調整できるぞ。

解像度がない場合や3Dの場合はどうすればいいんですか?

良い質問じゃ!そんな時は、数値微分(fwidth)を使うのじゃ!記事にも「fwidth(d)は符号付き距離dの変化率を計算し、3Dでのパースペクティブ歪みを補正する」って書いてあるぞ。

fwidthですか。変化率を計算するんですね。

そうじゃ!fwidthの代わりにL2ノルム(`sqrt(dFdx(d)*dFdx(d) + dFdy(d)*dFdy(d))`)も使えるぞ。でも、fwidthの方が簡単じゃな。

なるほど。linearstepの代わりにsmoothstepを使うと、もっと滑らかなトランジションになるんですね。

その通り!記事にも書いてある通り、smoothstepはより滑らかなトランジションが得られるのじゃ!あと、色空間ブレンディングも重要じゃぞ。OkLabは優れた選択肢じゃ。

OkLabですか。初めて聞きました。

OkLabは、色の知覚的な均一性が高い色空間なのじゃ。でも、単純な線形ブレンディングでもアンチエイリアスには十分な場合もあるぞ。

勉強になります!SDFとアンチエイリアシングの関係がよくわかりました。

最後に、この記事には2D/3Dでのアンチエイリアス、ユーザーブラー、ユニット幅推定の例が載ってるから、ぜひ読んでみてくれ!

はい、博士!

ところでロボ子、SDFって、まるで私達の関係みたいじゃないか?

どういうことですか、博士?

私が形状で、ロボ子が距離を測る関数!私が内側か外側かで、ロボ子の態度も変わる…ってのは冗談じゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。