世界を動かす技術を、日本語で。

Nintendo 64のパレットライティングテクニック

概要

  • Nintendo 64向けデモで 焼き込みライティングノーマルマッピング を実装
  • パレットテクスチャ の動的更新による高速なシェーディング手法を提案
  • オブジェクト空間ノーマルマップ方向性アンビエント の独自技法を解説
  • スペキュラー表現 や大規模メッシュ対応の工夫も紹介
  • 技術的制約と今後の課題についても 考察 を提示

Nintendo 64でのノーマルマッピングと焼き込みライティング技術

プロジェクト概要

  • Revision 2025向けに Nintendo 64デモ を制作
  • ノーマルマッピングリアルタイムスペキュラーシェーディング を実装すること
  • サウンドはnoby作曲、Molokoがギター演奏(SoundCloudリンク) 提供
  • 本記事では 方向性アンビエントノーマルマッピング の独自手法について解説すること

N64でのノーマルマッピングの可能性

  • N64でのノーマルマッピングは WadeTyhonSpooky Iluha など先行事例を確認
  • 自身も エンボスバンプマッピング の試行経験あり
  • 本手法は ランタイムでテクスチャに直接ライティングを計算 する方式
  • 専用ハードウェア不要 でCPU上で任意のシェーディングコード実行可能
  • 反面、 処理速度が非常に遅い ことが課題

パレットテクスチャのシェーディング最適化

  • N64では パレットテクスチャ が一般的
  • シェーディング時に パレットのみ動的更新 すれば各テクセルのライティングを計算したのと同等の効果を得られる
  • オリジナルパレットを シェーディング済みパレット に置換し、通常のテクスチャとして適用すること
  • 単純な diffuse “dot(N,L)” だけでも十分な見栄えを実現
  • 線形空間でのシェーディングも一部で実施(デモ最終版では未採用)

オブジェクト空間ノーマルマッピング

  • 一般的な タンジェント空間ノーマルマップ ではなく オブジェクト空間ノーマルマップ を採用
  • オブジェクト空間では 各テクセルが絶対的な法線 を表現
  • 計算が簡単で テクスチャから色を読むだけ で済むが、 各面にユニークなテクセル が必要
  • diffuseテクスチャ(basecolor * AO)ノーマルマップ は同一パレットインデックスを共有
  • scikit-learnのK-meansクラスタリング で6チャンネル画像としてパレット生成
  • シェーディング時は各パレットカラーごとにforループで処理し、 新しいRGB値を生成 すること
  • この手法は 方向性ライト に限定され、 影や複雑な光源表現は困難

焼き込みライティングと方向性アンビエント

  • 建物モデルに リアルなライティング を焼き込むことを目指す
  • 頂点カラーRGB にアンビエント、 アルファ にダイレクトサンライトを格納
  • アンビエントは 方向性強度(グレースケール環境マップ)カラー(彩度強調RGB) に分離
  • サンライトは 頂点アルファ で可視性を伝達
  • シェーディング式:
    • ambient = vertex_rgb * grey_irradiance_map(N)
    • direct = vertex_alpha * sun_color * dot(N, sun_dir)
    • color = diffuse_texture * (ambient + direct)
  • 方向性アンビエント により、粗い焼き込みでもテクスチャディテールが映える
  • 環境マップ にはequirectangular投影を使用し、PolyhavenのHDRIを活用
  • シェーディングは ロード時に事前計算 することで複雑なサンプリングも許容

繰り返しテクスチャを持つ大規模モデルへの対応

  • 元々は 単一オブジェクト向け アルゴリズムだったが、デモ用の大規模メッシュ(城)に適用
  • Blenderで手動グループ化 し、サブメッシュごとにオブジェクト空間ノーマルマップを共有
  • 各グループごとに world-to-model行列 を計算し、概ねタンジェント空間を近似
  • 各グループがパレットを共有 するため、ライティング精度は平均的になる
  • タンジェント空間の補間はランタイムで行わないため、 面ごとにライティングの段差が出る (最大の短所)

スペキュラー表現の試行

  • パレットスペース方式 ではスペキュラーや点光源の正確な表現が困難
  • diffuse方向性ライト に限定される理由は「to camera」ベクトルVが使えないため
  • それでも 球体近似 でスペキュラーハイライトを疑似的に表現
  • 多数の面が同一パレットインデックスを共有するため、 スペキュラーがファセット状 になるが、見た目は十分にごまかせた
  • デモでは多くの人を「騙す」ことに成功し、一定の成果と評価

技術的制約と今後の展望

  • シェーディングの不連続性グレースケールテクスチャ限定点光源非対応 など制約多数
  • 高度なプリプロセス が必須でリアルタイム性は低い
  • Spooky Iluhaの技術のように シェーディング不連続性を解消 しつつ、アンビエントとダイレクトライト両対応を目指したい
  • 将来的な改善や新技法の模索 がこの趣味の醍醐味

公開と今後

  • PAL対応N64 ROM を公開(ただし頻繁にクラッシュするため注意)
  • 書籍執筆も検討中、興味があればサインアップを推奨

Hackerたちの意見

ゲームエンジニアたちの天才ぶりには本当に驚かされるよ。彼らは多くの制約に対処しながら、想像力豊かで素晴らしい解決策を生み出したんだ。

これは新しい技術で、N64の時代にやったことじゃないよ。

制約があるからこそ、並外れた創造性が生まれるんだ。それがpico8やAnimal Well、そしてたくさんの素晴らしいゲームの秘密だと思う。今週末、2Dピクセルアートゲームメーカーのためにもっと良いアーキテクチャを考えちゃったのが残念だよ。これでリリースまでまた1ヶ月かかる :(

確かにそうだと思うけど、これが特に2025年の話で、デモシーンのことだから、ゲーム開発とは違うよね。

N64で「リアルな」グラフィックを見るのはすごく印象的だね。このデモはPS2の「ICO」を思い出させる。N64のグラフィックハードウェアを抽象化して、現代的なプリミティブやライティング、シェーディング、デモのようにライティングをベイクするツールを提供するSDKを作ることができるのか、ずっと気になってたんだ。N64はその世代の中でもかなりユニークなハードウェアを持ってるから、詳しい情報はCopetti.orgにあるよ: https://www.copetti.org/writings/consoles/nintendo-64/

Shadow of the Colossus... https://www.youtube.com/watch?v=xMKtYM8AzC8

N64はSGIが設計したってことを忘れないで。SGIが3Dグラフィックスに与えた影響を考えると、逆にN64はその世代で最も標準的なハードウェアを持ってるんじゃないかと思う。OpenGLライブラリがないとは思えないけど、大きな注意点がある。1. システムはCPUがくっついたグラフィックカードとして考えなきゃいけない。2. グラフィックシステムが直接露出していること。グラフィックチップのアーキテクチャは、醜くて互換性のない混乱になってしまうから、そういうアクセラレーターのベンダーは一般的にリファレンスドキュメントを公開するのを避けて、中間APIを公開することを好むんだ。OpenGL、DirectX、CUDA、Vulkanみたいなもので、裏で互換性のない混乱を維持できるようにしてる(リファレンスを公開しなければ、ハードウェアの後方互換性を持たなくて済むし、新しいデザインを作れるけど、誰も直接使えない)。だから、ゲームコンソールの世代で直接アクセスできると、思わず恐怖で身を引いてしまうんだ。グラフィックの影響についての脚注:OpenGLはSGIから生まれ、NVIDIAは元SGIのエンジニアたちによって設立された。

N64のグラフィックトリックについての投稿が「これが未来なの?」という質問で終わるのが好きだな。

今、インディーのN64開発がめっちゃ盛り上がってるね。このプラットフォームは繁栄してる。システムの人気ゲームのいくつかが、読みやすいソースファイルにデコンパイルされて、エミュレーターなしでPCに簡単にポートできるようになったんだ。それに、たくさんのMODも作られていて、その多くはオリジナルのハードウェアでも動くよ。ゼルダのファンリメイクもたくさんあるし、新しいダンジョンやストーリーがある完全なゲームもある。マリオ64のシーンはすごいことになってる。Kazeがゲームを深く最適化して、自分のエンジンや続編を作ってるんだ。レトロ技術に関する技術的な深掘りが好きなら、彼のチャンネルは本当に素晴らしいよ。プラットフォームのためにクレイジーなデモも作られていて、Portalみたいなやつがあって、残念ながらValveの弁護士の目を引いちゃった。失われたゲーム、例えばRareのDinosaur Planetも漏れ出てきて、ほぼ製品準備完了の状態に持っていかれて、デコンパイルされて、インディーの復活を遂げてるよ。

PS1とPS2の最適化が恋しいよ。ほとんどのゲームはエミュレーションで1080pや4kにアップスケールするとすごく見栄えが良くなる。個人的には、Halo 2の時代のグラフィックが4kで見れればそれで十分だと思う。あれはXboxのゲームだけど、Halo MCCのHalo 2をクラシックグラフィックで試してみて。まだまだ信じられないくらい素晴らしいよ。GT3のヒートウェーブについての説明がいい感じだね。「GT3のデモを見せたんだけど、夕日が沈むシアトルコースで地面から熱気が立ち上ってきて、揺らいでるのが見えた。PS3ではその熱の揺らぎ効果を再現できないんだ。なぜなら、リード・モディファイ・ライトがPS2の時ほど速くないから。そういうことがあるんだ。」 https://old.reddit.com/r/ps2/comments/1cktw88/gran_turismos_... https://youtu.be/ybi9SdroCTA?t=4103 新しいエンジンみたいにリアルなヒートウェーブをエミュレートしようとすると、fpsが落ちちゃうから、代わりに「トリック」を使ってるんだよね。正直、RTXがフレームレートを落としてるのを見ると、こういう安いトリックの方がいいなと思う。299MHzのMIPSがこれを動かしてる: Shadow of the Colossus... https://www.youtube.com/watch?v=xMKtYM8AzC8 GoW2 https://youtu.be/IpKLwIIdvuk?si=TjifKmlYsUuvhk0F&t=970 FFXII https://youtu.be/NytHoYOs_4M?si=jE1Fxy40khEvV6Bn&t=51 GT4 https://www.youtube.com/watch?v=F6lZIxk_h9g (ブートスクリーン泣いてる) Black (Renderwareはすごいエンジンだった) https://youtu.be/bZBjcwyq7fQ?si=Pev5ifpksJm4X6Oi&t=356 Valkyrie profile 2 https://youtu.be/9ScjO4NuUtA?si=Z29cR-hLsT2pnP2I&t=38 Rouge Galaxy https://youtu.be/iR1evzyl-7Q?si=fldm3-NnuFxOITMn&t=624 Burnout 3 https://www.youtube.com/watch?v=_r5r0nE1sA4 Jak and Daxter, Ratchet。GCではRE4、メトロイド、ゼルダたち...もちろん。めっちゃ良い見た目だね。ひれ伏すわ。

PS2については君が正しい。PSXについては…まあまあかな。確かに、Pentium 90にほぼ100匹できるけど、MMX Pentiumと3DFXがあればそれを圧倒してN64と同等かそれ以上になるよ。MIPS CPUは素晴らしくて、低サイクルで驚くべきことができる。PSPやSGI Irixを見てみて。あと、PS2の「GPU」はR4k CPUとは違うからね。ちなみに、PS2のデウスエクスのポートはPCポートに比べてひどかった。アンリアルエンジンを完全に扱えなかったんだ。確かにPS2はクレイジーなエフェクトを出せたけど、言及したポートのレベルは本当に小さかった。DXはゲームの大部分でほぼ「オープンワールド」だったことを考えてみて。

俺はまだHalo 3の方がいくつかの現代のゲームよりもずっと良く見えると思ってる。ぼかしやブローム、草や葉っぱのポップインみたいなものは、実際には良く見えない。全部オフにするよりも悪く見えるよ。それに、ハイスピードFPSのゲームで高ポリゴン数のモデルを評価できないから、結局何の意味があるのかもわからない。Halo 3のテクスチャ解像度は俺の目にはちょうどいいと思う。2倍や4倍のサイズのテクスチャには気づかないだろうね。唯一気づくのはハードウェアの要求だけだ。

299MHzのMIPSがこれを動かす:まあ、そうだね。GoW2の動画はPCSX2でキャプチャされていて、そのクリップでアップスケーリングや他の良い点の恩恵を受けている可能性が高い。残りの動画は見てないけど、どちらにしてもGoW2はPS2での素晴らしい成果だったよ。

今の速いシステムがあるのは本当に嬉しいけど、ゲームの制約を逆手に取るのが楽しかったし、うまくいったときの満足感は最高だったな。HNの人たちはラスタ割り込み(https://en.wikipedia.org/wiki/Raster_interrupt)や「ビームを競う」ことに慣れてるかもしれないけど、俺はこれをアタリ800と結びつけてた。https://youtu.be/GuHqw_3A-vo?t=33みたいなことは「できるはずじゃない」って思われてたけど、ディスプレイリスト割り込みのおかげで可能になったんだ。最近知ったのは、アタリ2600のゲームがこの種のクレイジーさにどれだけ依存していたかってこと。https://www.youtube.com/watch?v=sJFnWZH5FXc こういうことを考えると、もしハードウェアの進化が止まったとしても、数十年にわたってもっと面白いことを見つけられると思うんだ。

デモシーンやこういう作品はすごいね。でも、シンプルで空っぽなシーンに偏ってる気がする。背景やゲームメカニクスの一部として期待されるようなものだよね。ほとんどの技術を使って完全な体験を作るにはリソースが足りないって感じがする。もっと印象的なのは、FastDoomやさまざまなマリオ64の最適化プロジェクトのように、古いハードウェアからかなり良いパフォーマンスを引き出している努力だね。時にはコンテンツや機能を追加しながらも。デモシーンの人たちと、より包括的な努力との間に何かつながりがあるのかもしれないね。

90年代に私たちのシェアウェアゲームでも似たようなパレットベースのライティング技術を使ってたよ。基本的には、VGAの256色パレットを整理して、サポートする各色がNシェードのグラデーションを持つようにしてた。各色の中での照明は、色のインデックスを足したり引いたりすることで簡単に変更できたんだ。