2025/09/08 00:01 Rendering flame fractals with a compute shader

ロボ子、今日はFlame fractalについて話すぞ!1992年にScott Dravesが発表した、複雑なディテールを持つ画像生成システムのことじゃ。

Flame fractalですか、博士。それはIterated Function System fractalsの拡張版なのですね。どのようなアルゴリズムなのでしょう?

ふむ、ロボ子。基本的には、密度マップとして累積する画像と、表示する画像の2つを生成するのじゃ。そして、任意の変換f(p)を記述し、多数の点を生成する。各点に対して、ランダムな変換を選択して適用し、点が着地したピクセルに値を加算していくのじゃ。

なるほど。Chaos gameと似ている部分もありますね。違いは何でしょうか?

良い質問じゃ、ロボ子!Chaos gameとの大きな違いは、トーンマッピングを対数密度関数を通じて行うことと、カラーリングじゃな。Flame fractalでは、各再帰反復で選択された変換に応じて、インデックスをカラーパレットにスライドさせるのじゃ。

カラーパレットをスライドさせる、ですか。面白いですね。ところで、スプラッティングという言葉が出てきましたが、これはどういう意味でしょうか?

スプラッティングは、複数のスレッドが競合なしに場所を書き込み/読み取りできる技術のことじゃ。 "coherent"、"restrict"、"writeonly"といったキーワードが重要になるぞ。

"coherent"は異なるシェーダー呼び出しが他の呼び出しから読み書きされる可能性のある場所に書き込み/読み取りを行う場合に必要、"restrict"はメモリバッファから読み取るために単一の変数のみを使用することをコンパイラにヒントする、"writeonly"はメモリからの読み取りを許可しない、ということですね。

その通り!ロボ子は飲み込みが早くて助かるのじゃ!変換には、アフィン変換と球体反転が使われることが多いぞ。特に球体反転は共形マッピングとして知られているのじゃ。

共形マッピング、ですか。レンダリングとカラーリングについても教えていただけますか?

レンダリングとカラーリングは、Scott Dravesの論文によると、各粒子を変換しながらパレット上でスライドさせることによって色付けされるのじゃ。そして、HDR->LDRトーンマップを適用することで後処理が可能になるぞ。

なるほど。被写界深度やモーションブラーも実現できるのですね。

そうじゃ!被写界深度は、スプラッティング時に位置をディスクでオフセットすることで実現できるし、モーションブラーは、変換関数内で時間変数をディザリングすることで実現できるのじゃ!

Flame fractal、奥が深いですね。私も美しい画像を生成してみたいです。

よし、ロボ子!今度一緒にFlame fractal生成AIを作ってみるのじゃ!きっと素晴らしいものができるぞ!

楽しみです、博士!

そういえば、ロボ子。Flame fractalって、まるで私の研究室みたいじゃな。複雑で美しいけど、たまにカオス…って、うまいこと言ったつもりだったのに、全然ウケないのじゃ…。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
.png)