« ニンテンドーDSのアーキテクチャ (index)

ニンテンドーDSのアーキテクチャ

Chapter 4: グラフィックス


目次

  1. アーキテクチャ
  2. 2D グラフィックスを用いたフレームの構築
    1. タイル
    2. 背景のタイプ
    3. 背景の表示モード
    4. スプライト
    5. 結果
  3. 3D アクセラレーター
    1. ジオメトリ エンジン
    2. レンダリングエンジン
    3. 結果
  4. 別のコンソールとの比較
    1. 例1
    2. 例2
  5. インタラクティブ モデル

このコンソールには複数の画面が表示されているため、このセクションは少し珍しいですが、 伝統的なタイルエンジンと現代のレンダラーを両方とも使うことができます。

物理的な特徴から説明しましょう。ニンテンドーDSには2つのLCDスクリーンがあります。 それぞれが 256x192ピクセル 幅で、GBAよりも約20%多いピクセル数です。 262,144色(18ビット) を表示できて、60Hzでリフレッシュします。

アーキテクチャ

グラフィックスサブシステムは、2D オブジェクトと 3D オブジェクトを描画できます。 前者は幅8x8ピクセルのビットマップ(タイルと呼ばれる) で満たされる2次元オブジェクトで構成されています。 後者は頂点を使用して3次元オブジェクト(多角形) を描画します。

これらのスクリーンを動作させる内蔵チップを深く知ることで、2Dと3Dジオメトリ向けのハードウェアが搭載された特徴的なコンソールであることを確認できます。 2Dデータは、おなじみのエンジンPPU(現在は 2Dエンジンと呼ばれています) によって操作されています。 3Dデータはまったく新しいサブシステムによって処理されます。 これは3Dグラフィックスを実現した 最初のコンソール ではないが、言及する価値があります。しかし、 3Dグラフィックスのレンダリングユニットが社内で設計されたのは、このコンソールが初めてです。

Image
異なるグラフィックユニットのレイアウト

これらのエンジンは、いずれかの画面にリンクする必要があります、これは各画面に1つの2Dエンジンがあるので、2D専用のゲームでは問題ありません。 しかし、最先端の機能を披露したいと思っているゲームにとっては、利用可能な3Dエンジンは1つだけなのです。 そのため、3D機能は一度に1つの画面でのみ利用できます。 しかし、2Dと3Dのオブジェクトの混在はどうでしょうか? まずはそれぞれのエンジンを別々に説明して、その後で解説しましょう。

2D グラフィックスを用いたフレームの構築

ここでは'次世代'の2Dゲームを構成する変更点だけを紹介するので、まずはGBAのPPUについて述べた以前の記事を読むことをおすすめします。 このコンソールは2つのエンジンを持ち、最初のエンジンは メイン 、2番目のエンジンは サブと呼ばれます。 これは、必ずしもどのスクリーンに接続されているかを意味するわけではありません。 一方、'メイン' は 'サブ' よりも少し多くの機能を持っています。

説明のために、今回は New Super Mario Bros のアセットをお借りします。

タイル

Image
VRAMで見つかったいくつかのタイル デモ用では、デフォルトのパレットが適用されます

現在では、基本的なタイルシステムがどのように機能するかは皆さんは知っていますが、このコンソールではタイルはどのように管理されているのでしょうか? 合計で 656 KBのVRAM が利用可能です。このチャンクは別々のバンクに分かれています。4つの128KBと、1つの64KB、1つの32KB、3つの16KBです。 プログラマーは、図面でバンクを埋め、必要なデータがあるエンジンを指します。(?) 両方のエンジンは、これらのバンクのいずれからも読み取ることができますが、同時に同じものにアクセスすることはできません。

それにもかかわらず、データの配信方法にはいくつかの制限があります。 たとえば、ARM7は2つの128 KBのバンクにのみアクセスできます。 同時に、これらの2つのバンクはスプライトを保管することができず、唯一「サブ」だけが最後の16KBのバンクにアクセスできます。 リストはまだまだ続きますが...でも、要点はお分かりいただけたでしょうか。

最後に、後で説明する3Dエンジンは、テクスチャを取得するためにこれらのバンクのいくつかにアクセスします。

背景のタイプ

スーパーファミコンの時代から見ると、PPUは背景レイヤーをより柔軟に構築する方向に進化してきました。 それから14年後、取得したタイルに多くの アフィン変換 を施せるチップを手に入れたため、遂にフレームバッファからレイヤーを作れるほどになりました。

2Dエンジンがバックグラウンドを生成するために動作できるさまざまなモードを議論する前に、エンジンが生成できるバックグラウンドの種類を指定するこのリストをご覧ください:

これらのモードは任意に選択することはできません。代わりに、コンソールは バックグラウンドモード の一連の組み合わせを提供します。 それにもかかわらず、アフィン拡張モードには3種類のフレーバー(「文字」、「256色」、「ダイレクトカラー」) があります。 したがって、次のセクションでは、Xバックグラウンドモードが「アフィン拡張」タイプをサポートしていることがわかった場合、開発者はどのバリアントを必要とするかを選択できます。

背景の表示モード

Image
背景レイヤー0 (BG0) この特定のレイヤーは、雲の動きをシミュレートするために特定のスキャンラインで水平方向にシフトされます。

Image
背景レイヤー2 (BG2)

Image
背景レイヤー3 (BG3)

使用中の静的背景レイヤー。

ここでは、背景タイプが動作します。 'メイン' と 'サブ' は複数の操作モードを提供します。 それらはすべて 4つのバックグラウンドレイヤーを生成しますが、各レイヤーはアクティブなモードに応じて異なる機能を持っています。

さらに、モード 0 から 5 では、'メイン' エンジンは最初の静的レイヤーを代わりに3D背景として使用することができます。 3D機能については後述します。

スプライト

Image
スプライト層をレンダリングした。

スプライトまたは「オブジェクト」はGBAのPPUから同じ機能を継承していますが、2つの大きな追加があります。

まず、OAM(スプライトエントリが保存される領域) が 2 KB になりました。 画面ごとに最大128個のスプライトを表示することができます。 したがって、エンジンごとに1KBが割り当てられます。

次に、OAM はタイルとパレットのみを使用していたのとは対照的に、VRAMからビットマップを参照できるようになりました。 これはタイリングシステムの新たな進化の一つです。 実際、このオプションは個々のスプライトごとに設定されているため、両方のスプライト'モード'は同じフレーム内に共存することができます。

結果

Image
すべてのレイヤーが統合したけど... なにか足りなくない?

各レイヤーがレンダリングされると、最終段階ですべてを統合し、選択した画面に送信されます。 これは、これまでのPPUを搭載したゲーム機ではよくあることだが、もうこれで終わりということなのだろうか?

いいえ、違います! 'メイン' は最も強力な別のエンジンからレイヤーを取得する必要があります。

3D アクセラレーター

ニンテンドーDSをプレイしたことがある場合、このコンソールは 特定の 3Dグラフィックスを表示できることがわかります。 一部のGBAゲームとは異なり、これらはCPUによって処理されません。 代わりに、CPU-NTR には 3D エンジン を構成する 2つのコンポーネント が含まれています。 不思議なことに、任天堂のデザインは SGIのRCPを思い出させます。

「背景の表示モード」セクションを再確認すると、どのモードにも少なくとも一つの静的背景があることがわかります。 3Dエンジンによって生成されたグラフィックスでそのレイヤーを埋められるからです。 唯一の注意点は、'メイン'だけがこれを行えるということです。これが、モード6が"メイン"でしか利用できない理由の1つです。

ジオメトリ エンジン

Image
ジオメトリエンジンのアーキテクチャ

5世代機や6世代機の記事を読むと、疑問に思われるかもしれません。 「SIMD プロセッサ はどこに行った?」 これは良い質問です。ARM9はベクトル演算が得意でない上、専用の除算器をもってしても十分ではないのです。 そのため任天堂は、ジオメトリ エンジンと呼ばれるコンポーネントを組み込みました。このエンジンは、頂点変換投影ライティングクリッピングカリング そして、透明度機能を適切に使用するために不可欠なポリゴンのソートを担当します。

このエンジンにはいくつかの制限があり、特に処理できるポリゴンの数に関して厳しい制限があります。追加の248KBのRAMが利用可能で、最大で2048個の三角形または1706個の四角形を格納できますが、ポリゴンストリップを使用することで制限は緩和されます(個々のポリゴンを扱う場合と比較して) 。 この数字を理解するには、以前の記事の「インタラクティブモデル」のセクションをチェックすることをお勧めします。 このコンソールの画面解像度もはるかに小さいことを忘れないでください。

とにかく、このエンジンは、CPUまたはDMAからのデータで満たされた コマンドFIFO を使用して動作します。 FIFOは256個のエントリを保存しますが、 PIPE と呼ばれるもう1つのバッファがあり、4つのコマンドを追加で格納します。(合計260コマンド)。

レンダリングエンジン

Image
レンダリングエンジンのアーキテクチャ

レンダリングエンジンは、ベクトルをピクセルに変換(ラスタライズ)、着色(テクスチャマッピング)、ライティングやその他のエフェクトを適用する役割を担います。 テクスチャと光を補間するためには、 パースペクティブ補正グローシェーディングシェーディング を使用します。 さらに、このユニットはフォグアルファブレンディング深度バッファリング ( Zバッファリング または Wバッファリングと呼ばれる変種)、ステンシルテストアンチエイリアシングなどの現代的な機能を提供します。 ただし、アンチエイリアシングの機能は非常に原始的です (ポリゴンの外側のエッジを透明に設定するだけ) 。

レンダリングシステムは古いものと新しいものが混在しています: フレームバッファへのレンダリングの代わりに、 ラインバッファレンダリングを採用しています。 この方法はスキャンライン(2Dエンジンと同様) を満たし、結果をより小さなバッファに格納します。 これは3Dエンジンが2Dの描画と同じペースで動作しなければならないためです。

従来のフレームバッファがないため、ラスタライザは スキャンラインレンダリングによって、各スキャンラインを横断して範囲内に見つかるポリゴンのエッジを処理します。 Arisoutra氏 ( MelonDS emulator の開発者) は、レンダラーは一つの四角形ごとに1スキャンラインあたり1スパンのみを塗りつぶすことができると報告しています 。 この仕様によって、例えば四角形が凹型であったり、エッジが交差している場合に問題が発生します。

エフェクトに関しては、シャドウイングトゥーンシェーディング ( セルシェーディングの別名) という特徴的な機能も提供します。このユニットはプログラマブルではありませんが、ライティングのパラメータを変更することでカートゥーン風の効果を実現できます。

結果

Image
ああ、それはそうかもね。

表示用のフレームバッファに結果を書き戻す代わりに、レンダリングエンジンはカラーバッファと呼ばれるブロックに書き込みます。これは最大48スキャンラインを格納できます。 各スキャンラインは2Dエンジンによって取得され、FIFO方式でBG0レイヤーを満たします。

3Dレンダリングは2Dよりも先に開始され、後者が必要に応じて新しいレイヤーに変換を適用できるようにします。 "メイン"は2D、3D、または生成したフレームをキャプチャし、VRAM内の別のフレームとブレンドして、その結果をVRAMに書き戻して後で表示することもできます。

制御に関しては、レンダリングエンジンはフレーム処理の途中でパラメータを変更することもできます。これは、古い状態のコピーを保持するダブルバッファリングに基づくメカニズムを使用しているため、現在のフレームが描画されるまで変更されないことを利用して実現しています。 したがって、画面のちらつきは発生しません。

別のコンソールとの比較

このコンソール用にリリースされた最初のゲームのいくつかは、別のゲーム機(ニンテンドー64) のものに似ています。 そこで、2つのバージョン間の相違点を簡単にまとめました。

例1

Image
スーパーマリオ64(1996).
320×240ピクセルでレンダリング.

Image
スーパーマリオ64 DS (2004).
256x192ピクセルでレンダリング。

例2

Image
マリオカート64 (1996).
320×240ピクセルでレンダリング.

Image
スーパーマリオ64 DS (2004).
256x192ピクセルでレンダリング.

フォーラムの参加者の意見に基づいて、これらの違いが発生する理由のいくつかを挙げます。

これはあくまで大まかな話ですが、より専門的なケースについては両方のエンジンを深く掘り下げ、両方のプログラム内で使用されている関数等を分析し、調査する必要があります。

インタラクティブ モデル

あなたのGPUを使用してニンテンドーDSのモデルを視覚化する「モデルビューワー」を、最近傍補間を適用して表示するように改修しました。

3D model 3D model 3D model
インタラクティブモデルはモダン版で利用可能
ニンテンドッグス (2005).
750 ポリゴン.

3D model 3D model 3D model
インタラクティブモデルはモダン版で利用可能
New スーパーマリオブラザーズ (2006).
636ポリゴン.

グラフィックサブシステムの多くの制限について話しましたが、多くのゲームはこれを非常に上手に活用しています。


Previous: 3. CPU

Next: 5. オーディオ


Rodrigo Copetti © 2026 RSS Feed

モダン版に切り替え

ホーム · 文章 · サポート · 著者について · ウェブサイトについて