本ドキュメントは、3DS のグラフィックス機能を利用する上で必要となる、基本的な情報とプログラミング手順について説明したものです。3DS の 3D グラフィックス機能は OpenGL ES 1.1 をベースにしていますので、本ドキュメントを読むにあたっては OpenGL についての知識や行列やベクトルの数学についての知識が必要になります。
3DS は OpenGL の使用をサポートしていますが、3D グラフィックス機能を多用する場合、そのまま GL 関数を呼び出すよりも、「3DS プログラミングマニュアル - グラフィックス応用編」で説明しているコマンドキャッシュや 3D コマンドによる PICA レジスタへの直接書き込みを処理速度の観点から推奨されるケースが多くあります。グラフィックス応用編ではそのほかの機能についても説明していますので、本ドキュメントに続けて目を通しておいてください。
グラフィックスの描画には、GL、GD、GR と弊社から配布しております NintendoWare for CTR(NW4C)の 4 種類のライブラリが用意されています。
GL は基本的なライブラリに位置づけられ、OpenGL ES に準拠した関数やエラー処理、ステートの差分管理などのリッチな機能が用意されているため処理が重く、パフォーマンスが必要な場合の使用は推奨されていません。
GD は GL よりも軽量化されたライブラリです。GL との互換性はありませんが、GL と同等の機能と開発者が扱いやすい API を提供します。内部処理のため、ある程度の CPU 処理負荷を必要とします。
GR は 3D コマンドの直接生成を支援するためのライブラリです。最も高速に動作しますが、レジスタの設定方法に深い理解が必要で、エラーチェックなども開発者が行わなければなりません。
NW4C では、コマンドキャッシュなどの機能を利用したライブラリをソースコード込みで提供していますので、NW4C の活用についてもご検討ください。NW4C はそのまま使用することで最適化されたパフォーマンスを発揮できるように実装されていますが、独自の処理を行いたい場合は GR や GD ライブラリと組み合わせて使用することができます。
アプリケーションからグラフィックスライブラリに渡されるメモリ領域には、アライメントとサイズに制約があります。プログラミングマニュアル中では、アライメントとサイズの制約は数値で記載していますが、それぞれ定数が定義されています。定義されている定数については、APIリファレンスを参照してください。
1.1. 章の構成
「2. GPU」では、3DS に搭載されている GPU の概要と機能を紹介し、グラフィックス処理がどのような順序で行われるのかを説明します。ここで、3DS のグラフィックスで表現できることと、グラフィックス処理の全体像について把握してください。
「3. LCD」では、3DS に搭載されている LCD と GX ライブラリとの関係を説明します。ここで、GX ライブラリと LCD 表示が密接に関係していることを理解してください。
「4. コマンドリスト」では、3D グラフィックス処理のコマンドを実行するために必要なコマンドリストについて説明します。
「5. シェーダプログラム」では、シェーダプログラムの種類と使用方法について説明します。
「6. 頂点バッファ」では、頂点データをまとめて頂点シェーダに入力する頂点バッファの作成方法と使用方法について説明します。
「7. テクスチャ」では、3DS が扱うことのできるテクスチャイメージの種類と、ネイティブフォーマットについて説明します。
「8. 頂点シェーダ」では、頂点データの入力と以降の処理で使用する頂点属性の出力について説明します。
「9. ジオメトリシェーダ」では、SDK で用意されている、ポイントやラインの基本的な図形を生成するシェーダ、シルエットやサブディビジョンのように便利なシェーダの概要とその使用方法について説明します。
「10. ラスタライズ」では、フラグメント処理の直前に行われる処理について説明します。3DS ではシザーテストがこの段階で行われています。
「11. テクスチャ処理」では、テクスチャユニット、コンバイナ、コンバイナバッファによるテクセル色の決定やライトとカラーの合成、プロシージャルテクスチャの作成方法について説明します。
「12. 予約フラグメントシェーダ」では、フラグメントライティングやシャドウ、フォグ、ガスレンダリングなど、予約ユニフォームによって制御することのできるフラグメント処理について説明します。
「13. パーフラグメントオペレーション」では、フラグメントがレンダーバッファに書き込まれるまでに行われる処理について説明しています。アルファテストなどのテスト、ブレンディングについてはここを参照してください。
「14. フレームバッファオペレーション」では、フレームバッファに対する処理とバッファクリアについて説明しています。
「15. その他」では、OpenGL ES の仕様との相違点などをまとめています。
立体視表示、ブロックモード、アーリーデプステストなどの特殊な設定を必要とする機能や、照明モデルの実装例、グラフィックスコマンドのキャッシング機能、PICA レジスタの情報は「3DS プログラミングマニュアル - グラフィックス応用編」で紹介しています。
1.2. グラフィックス処理のエラーについて
3DS の 3D グラフィックス機能は OpenGL ES をベースにしているため、3D グラフィックス処理の関数呼び出しで発生したエラー時の挙動は、OpenGL ES と同じ仕様になっています。
-
GL_OUT_OF_MEMORY
のエラーを除いて、該当の関数の処理は無視されます。 - エラーコードは
glGetError()
で読み取ることができます。 - エラーコードは 1 つしか記録されません。
glGetError()
で読み取るまで、次のエラーが生成されてもエラーコードは更新されません。
記録されるエラーコードには、以下のものがあります。
エラーコード |
エラーが生成される条件 |
---|---|
|
|
|
数値型の引数に範囲外の値を指定した場合など |
|
その段階で呼び出すことのできない関数を呼び出した場合など |
|
関数の実行に必要なメモリが足りない場合 |
1.3. シングルスレッドモデル
3D グラフィックス機能のライブラリは、単一のスレッドから呼び出されることを想定して設計されています。そのため、複数のスレッドから関数が呼び出されたときの動作は保証されません。また、関数の呼び出しは単一のレンダリングコンテキストに対してのみ行われなければなりません。