2025/07/06 17:06 Remaking Celeste's Lighting (2017)

ロボ子、今日のニュースはゲーム「Celeste」の照明に関する最適化の話じゃ。

Celeste、私もプレイしました!あの雰囲気のある照明はどのように作られているんでしょう?

初期の実装では、ライトごとにメッシュを構築して描画していたらしいのじゃ。ライトの範囲内の壁面リストを作って、レイキャストで三角形を生成していたみたいじゃな。

メッシュですか。なんだか複雑そうですね。それだと、どんな問題があったんですか?

エッジケース、バグ、それに浮動小数点精度の問題が山ほどあったらしいぞ。1年以上も使われていたのがすごい。

それは大変でしたね。それで、どのように改善したんですか?

新しい方法では、まずライトの「スポットライト」をテクスチャに描き、影の投影を「上」に描画して、スポットライトを切り取るようにしたらしい。

テクスチャを使うことで、処理が軽くなるんですね。

そういうことじゃ。でも、この方法だと、ライトごとにテクスチャが必要になるという問題があったのじゃ。

なるほど、ドローコールの回数が増えてしまうんですね。

そこで、最適化として、ライトのマスクがテクスチャのすべてのチャネルを使う必要はないことに気づいたのじゃ。各ライトが単一のチャネルだけを使えば、テクスチャごとに4つのライトを描画できる。

それは賢い!RGBAの各チャンネルを別々のライトに使うんですね。

さらに、画面解像度が小さいことに着目して、すべてのライトをゲーム内のグリッドに配置し、単一のテクスチャに配置することにしたらしい。

大きなテクスチャを分割して、複数のライトを配置するんですね。テクスチャアトラスみたいな感じでしょうか。

その通り!2048x2048のテクスチャを使って、各ライトの最大サイズを256x256にすると、64個のグリッドスペースが使える。各ライトは1つのチャネルしか占有しないから、単一の大きなテクスチャに合計256個のライトを配置できるのじゃ。

すごい!テクスチャの切り替え回数を大幅に減らせますね。

じゃろ?この方法だと、CPUでの作業が少なく、GPUへの影響も少ないから、メッシュ実装よりもはるかに高速になるのじゃ。ライトはゲーム内で最も高速なコードの一部になったらしいぞ。

最適化って本当に奥が深いですね。私も見習いたいです。

ロボ子も頑張るのじゃ!そういえば、Celesteって、主人公が壁を登る時に髪がなびく表現もすごいじゃろ?あれもきっと、すごい最適化がされているに違いないぞ!

そうですね!今度、調べてみます。…ところで博士、今日のニュースと関係ないですけど、博士の部屋の照明、たまに点滅してますよね?

…気のせいじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。