このコンソールには複数の画面が表示されているため、このセクションは少し珍しいですが、 伝統的なタイルエンジンと現代のレンダラーを両方とも使うことができます。
物理的な特徴から説明しましょう。ニンテンドーDSには2つのLCDスクリーンがあります。 それぞれが 256x192ピクセル 幅で、GBAよりも約20%多いピクセル数です。 262,144色(18ビット) を表示できて、60Hzでリフレッシュします。
アーキテクチャ
グラフィックスサブシステムは、2D オブジェクトと 3D オブジェクトを描画できます。 前者は幅8x8ピクセルのビットマップ(タイルと呼ばれる) で満たされる2次元オブジェクトで構成されています。 後者は頂点を使用して3次元オブジェクト(多角形) を描画します。
これらのスクリーンを動作させる内蔵チップを深く知ることで、2Dと3Dジオメトリ向けのハードウェアが搭載された特徴的なコンソールであることを確認できます。 2Dデータは、おなじみのエンジンPPU(現在は 2Dエンジンと呼ばれています) によって操作されています。 3Dデータはまったく新しいサブシステムによって処理されます。 これは3Dグラフィックスを実現した 最初のコンソール ではないが、言及する価値があります。しかし、 3Dグラフィックスのレンダリングユニットが社内で設計されたのは、このコンソールが初めてです。
これらのエンジンは、いずれかの画面にリンクする必要があります、これは各画面に1つの2Dエンジンがあるので、2D専用のゲームでは問題ありません。 しかし、最先端の機能を披露したいと思っているゲームにとっては、利用可能な3Dエンジンは1つだけなのです。 そのため、3D機能は一度に1つの画面でのみ利用できます。 しかし、2Dと3Dのオブジェクトの混在はどうでしょうか? まずはそれぞれのエンジンを別々に説明して、その後で解説しましょう。
2D グラフィックスを用いたフレームの構築
ここでは'次世代'の2Dゲームを構成する変更点だけを紹介するので、まずはGBAのPPUについて述べた以前の記事を読むことをおすすめします。 このコンソールは2つのエンジンを持ち、最初のエンジンは メイン 、2番目のエンジンは サブと呼ばれます。 これは、必ずしもどのスクリーンに接続されているかを意味するわけではありません。 一方、'メイン' は 'サブ' よりも少し多くの機能を持っています。
説明のために、今回は New Super Mario Bros のアセットをお借りします。
タイル

VRAMで見つかったいくつかのタイル デモ用では、デフォルトのパレットが適用されます
現在では、基本的なタイルシステムがどのように機能するかは皆さんは知っていますが、このコンソールではタイルはどのように管理されているのでしょうか? 合計で 656 KBのVRAM が利用可能です。このチャンクは別々のバンクに分かれています。4つの128KBと、1つの64KB、1つの32KB、3つの16KBです。 プログラマーは、図面でバンクを埋め、必要なデータがあるエンジンを指します。(?) 両方のエンジンは、これらのバンクのいずれからも読み取ることができますが、同時に同じものにアクセスすることはできません。
それにもかかわらず、データの配信方法にはいくつかの制限があります。 たとえば、ARM7は2つの128 KBのバンクにのみアクセスできます。 同時に、これらの2つのバンクはスプライトを保管することができず、唯一「サブ」だけが最後の16KBのバンクにアクセスできます。 リストはまだまだ続きますが...でも、要点はお分かりいただけたでしょうか。
最後に、後で説明する3Dエンジンは、テクスチャを取得するためにこれらのバンクのいくつかにアクセスします。
背景のタイプ
スーパーファミコンの時代から見ると、PPUは背景レイヤーをより柔軟に構築する方向に進化してきました。 それから14年後、取得したタイルに多くの アフィン変換 を施せるチップを手に入れたため、遂にフレームバッファからレイヤーを作れるほどになりました。
2Dエンジンがバックグラウンドを生成するために動作できるさまざまなモードを議論する前に、エンジンが生成できるバックグラウンドの種類を指定するこのリストをご覧ください:
- 文字タイプグループ: これらの背景タイプは従来のタイルシステムに従って、フレームはタイルで塗りつぶしてレンダリングされます。
- 静的 もしくは テキスト背景: 通常の背景。 最大512x512 ピクセル、256色、16パレット。 これは、すべての典型的な エフェクト (H/Vフリッピング、H/Vスクロール、モザイク、アルファブレンド) と追加の「フェード」エフェクトを含みます。 最大1024タイルまで使用できます。
- アフィン背景: アフィン変換 を適用する背景。 しかし、H/Vのフリップは許さず、256タイルのみを取得することができます(最大タイル数の4分の1)。 このレイヤーのサイズは、幅1024x1024 ピクセルです。
- アフィン拡張 - キャラクター: アフィンと同じですが、タイルの全量を復元し、H/Vフリップをサポートします。
- ビットマップタイプグループ: タイルを処理する代わりに、エンジンは VRAM をフレームバッファとして扱います。
- アフィン拡張 - 256 色: 「アフィン拡張 - キャラクター」から利用可能なすべてのエフェクトを継承します。 違いは、512x512 px の単一ビットマップに適用されることです。
- アフィン拡張 - ダイレクトカラー: フレームバッファが32,768色(15ビット) をサポートするようになりました。
- 大画面: 大きな1024x512 ピクセルのフレームバッファをレンダリングするため、128 KB のVRAMのチャンクを使用します。
- 3D 背景: 3Dエンジンの背景レイヤーを表示します。 3Dエンジンが処理したものを表示するために不可欠です。 それは多くの2Dエフェクトを提供しませんが、水平スクロールやアルファブレンド(他のバックグラウンドレイヤーとの) のような興味深い機能があります。 また、最大262,144色(18-bit) をサポートする唯一のタイプです。
これらのモードは任意に選択することはできません。代わりに、コンソールは バックグラウンドモード の一連の組み合わせを提供します。 それにもかかわらず、アフィン拡張モードには3種類のフレーバー(「文字」、「256色」、「ダイレクトカラー」) があります。 したがって、次のセクションでは、Xバックグラウンドモードが「アフィン拡張」タイプをサポートしていることがわかった場合、開発者はどのバリアントを必要とするかを選択できます。
背景の表示モード

背景レイヤー0 (BG0) この特定のレイヤーは、雲の動きをシミュレートするために特定のスキャンラインで水平方向にシフトされます。
ここでは、背景タイプが動作します。 'メイン' と 'サブ' は複数の操作モードを提供します。 それらはすべて 4つのバックグラウンドレイヤーを生成しますが、各レイヤーはアクティブなモードに応じて異なる機能を持っています。
- モード 0: 4つの静的レイヤー
- モード 1: 3つの静的レイヤー + 1つのアフィンレイヤー
- モード 2: 2つの静的レイヤー + 2つのアフィンレイヤー
- モード 3: 3 スタティックレイヤー + 1 アフィン拡張レイヤー
- モード 4: 2つの静的レイヤー + 1つのアフィンレイヤー + 1つのアフィン拡張レイヤー
- モード 5: 2つの静的レイヤー + 2つのアフィン拡張レイヤー
- これは非常に柔軟性があるため、最も一般的なモードです。
- モード 6: 1つの3D 背景レイヤー + 1つの大画面レイヤー
- 単一フレームバッファ用のスペースしかないので、このモードは 'メイン' でのみ使用できます。
さらに、モード 0 から 5 では、'メイン' エンジンは最初の静的レイヤーを代わりに3D背景として使用することができます。 3D機能については後述します。
スプライト
スプライトまたは「オブジェクト」はGBAのPPUから同じ機能を継承していますが、2つの大きな追加があります。
まず、OAM(スプライトエントリが保存される領域) が 2 KB になりました。 画面ごとに最大128個のスプライトを表示することができます。 したがって、エンジンごとに1KBが割り当てられます。
次に、OAM はタイルとパレットのみを使用していたのとは対照的に、VRAMからビットマップを参照できるようになりました。 これはタイリングシステムの新たな進化の一つです。 実際、このオプションは個々のスプライトごとに設定されているため、両方のスプライト'モード'は同じフレーム内に共存することができます。
結果
各レイヤーがレンダリングされると、最終段階ですべてを統合し、選択した画面に送信されます。 これは、これまでのPPUを搭載したゲーム機ではよくあることだが、もうこれで終わりということなのだろうか?
いいえ、違います! 'メイン' は最も強力な別のエンジンからレイヤーを取得する必要があります。
3D アクセラレーター
ニンテンドーDSをプレイしたことがある場合、このコンソールは 特定の 3Dグラフィックスを表示できることがわかります。 一部のGBAゲームとは異なり、これらはCPUによって処理されません。 代わりに、CPU-NTR には 3D エンジン を構成する 2つのコンポーネント が含まれています。 不思議なことに、任天堂のデザインは SGIのRCPを思い出させます。
「背景の表示モード」セクションを再確認すると、どのモードにも少なくとも一つの静的背景があることがわかります。 3Dエンジンによって生成されたグラフィックスでそのレイヤーを埋められるからです。 唯一の注意点は、'メイン'だけがこれを行えるということです。これが、モード6が"メイン"でしか利用できない理由の1つです。
ジオメトリ エンジン
5世代機や6世代機の記事を読むと、疑問に思われるかもしれません。 「SIMD プロセッサ はどこに行った?」 これは良い質問です。ARM9はベクトル演算が得意でない上、専用の除算器をもってしても十分ではないのです。 そのため任天堂は、ジオメトリ エンジンと呼ばれるコンポーネントを組み込みました。このエンジンは、頂点変換、投影、ライティング、 クリッピング、カリング そして、透明度機能を適切に使用するために不可欠なポリゴンのソートを担当します。
このエンジンにはいくつかの制限があり、特に処理できるポリゴンの数に関して厳しい制限があります。追加の248KBのRAMが利用可能で、最大で2048個の三角形または1706個の四角形を格納できますが、ポリゴンストリップを使用することで制限は緩和されます(個々のポリゴンを扱う場合と比較して) 。 この数字を理解するには、以前の記事の「インタラクティブモデル」のセクションをチェックすることをお勧めします。 このコンソールの画面解像度もはるかに小さいことを忘れないでください。
とにかく、このエンジンは、CPUまたはDMAからのデータで満たされた コマンドFIFO を使用して動作します。 FIFOは256個のエントリを保存しますが、 PIPE と呼ばれるもう1つのバッファがあり、4つのコマンドを追加で格納します。(合計260コマンド)。
レンダリングエンジン
レンダリングエンジンは、ベクトルをピクセルに変換(ラスタライズ)、着色(テクスチャマッピング)、ライティングやその他のエフェクトを適用する役割を担います。 テクスチャと光を補間するためには、 パースペクティブ補正 と グローシェーディングシェーディング を使用します。 さらに、このユニットはフォグ、アルファブレンディング、深度バッファリング ( Zバッファリング または Wバッファリングと呼ばれる変種)、ステンシルテスト、アンチエイリアシングなどの現代的な機能を提供します。 ただし、アンチエイリアシングの機能は非常に原始的です (ポリゴンの外側のエッジを透明に設定するだけ) 。
レンダリングシステムは古いものと新しいものが混在しています: フレームバッファへのレンダリングの代わりに、 ラインバッファレンダリングを採用しています。 この方法はスキャンライン(2Dエンジンと同様) を満たし、結果をより小さなバッファに格納します。 これは3Dエンジンが2Dの描画と同じペースで動作しなければならないためです。
従来のフレームバッファがないため、ラスタライザは スキャンラインレンダリングによって、各スキャンラインを横断して範囲内に見つかるポリゴンのエッジを処理します。 Arisoutra氏 ( MelonDS emulator の開発者) は、レンダラーは一つの四角形ごとに1スキャンラインあたり1スパンのみを塗りつぶすことができると報告しています 。 この仕様によって、例えば四角形が凹型であったり、エッジが交差している場合に問題が発生します。
エフェクトに関しては、シャドウイングとトゥーンシェーディング ( セルシェーディングの別名) という特徴的な機能も提供します。このユニットはプログラマブルではありませんが、ライティングのパラメータを変更することでカートゥーン風の効果を実現できます。
結果
表示用のフレームバッファに結果を書き戻す代わりに、レンダリングエンジンはカラーバッファと呼ばれるブロックに書き込みます。これは最大48スキャンラインを格納できます。 各スキャンラインは2Dエンジンによって取得され、FIFO方式でBG0レイヤーを満たします。
3Dレンダリングは2Dよりも先に開始され、後者が必要に応じて新しいレイヤーに変換を適用できるようにします。 "メイン"は2D、3D、または生成したフレームをキャプチャし、VRAM内の別のフレームとブレンドして、その結果をVRAMに書き戻して後で表示することもできます。
制御に関しては、レンダリングエンジンはフレーム処理の途中でパラメータを変更することもできます。これは、古い状態のコピーを保持するダブルバッファリングに基づくメカニズムを使用しているため、現在のフレームが描画されるまで変更されないことを利用して実現しています。 したがって、画面のちらつきは発生しません。
別のコンソールとの比較
このコンソール用にリリースされた最初のゲームのいくつかは、別のゲーム機(ニンテンドー64) のものに似ています。 そこで、2つのバージョン間の相違点を簡単にまとめました。
例1

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

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

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

スーパーマリオ64 DS (2004).
256x192ピクセルでレンダリング.
フォーラムの参加者の意見に基づいて、これらの違いが発生する理由のいくつかを挙げます。
- NDSのテクスチャはよりカクカクに見える -> レンダリングエンジンはフィルタを使用せず、テクスチャは最近傍補間されるため。
- NDSのテクスチャはより鮮やかに見える -> レンダリングエンジンが4 KBのTMEMによって制限されていない。代わりに512 KBのVRAMを利用(圧縮機構を含む)し、より多くのデータを読み込むことができるため。
- NDSのモデルはピクセル化エッジを含む -> NDSモデルは、N64と比較して低解像度でレンダリングされるため。
- NDSのテクスチャは遠くから見ると歪んでみえる。-> ラスタライザは固定小数点座標を操作する。 低解像度であることと、ミップマッピングの欠如がエイリアシングに影響しているためだと考えられる。
これはあくまで大まかな話ですが、より専門的なケースについては両方のエンジンを深く掘り下げ、両方のプログラム内で使用されている関数等を分析し、調査する必要があります。
インタラクティブ モデル
あなたのGPUを使用してニンテンドーDSのモデルを視覚化する「モデルビューワー」を、最近傍補間を適用して表示するように改修しました。

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

インタラクティブモデルはモダン版で利用可能
New スーパーマリオブラザーズ (2006).
636ポリゴン.
グラフィックサブシステムの多くの制限について話しましたが、多くのゲームはこれを非常に上手に活用しています。






