ビデオ ゲームの開発は、ゲーム理論、コンピューター サイエンス、数学、物理学、芸術の知識を必要とする巨大な分野です。何に特化したいかによって、出発点が異なります。ただし、これはプログラミングに関する質問のサイトであるため、プログラミングに関するいくつかの洞察を以下に示します。
ファイル形式
アセット (モデル、テクスチャ、サウンド) は、さまざまなエクスポート形式を提供する専用のサードパーティ ツール (Gimp、Photoshop、Blender、3ds Max などを考えてください) を使用して作成されます。通常、これらの形式には 1 つの共通点があります。アプリケーション間の単純な通信用に最適化されていることです。
ビデオ ゲームには高いパフォーマンス要件があり、アセットはゲームプレイ中に常にロードおよびアンロードする必要があります。そのため、コンテンツはコンパクトで読み込みが速い形式である必要があります。多くの場合、サードパーティのフォーマットは、ゲーム プロジェクトの特定の要件を満たしていません。最適なパフォーマンスを得るには、独自のフォーマットを開発することを検討してください。
アセットと一般的なサードパーティ フォーマットの例:
- テクスチャ: PNG、JPG、BMP、TGA
- 3D モデル: OBJ、3DS、COLLADA
- サウンド:WAV、MP3
追加の例
Direct3D のテクスチャ
私のゲーム プロジェクトでは、テクスチャを前述のいずれかの形式からDDSファイルに変換するインポーターを使用しています。これは私が独自に開発した形式ではありませんが、Direct3D (Graphics API) でロードできる最速の形式の 1 つです。
静的 3D モデル
Wavefront OBJファイル形式は、非常に理解しやすいテキストベースの形式です。ほとんどの 3D モデリング アプリケーションでサポートされています。ただし、テキスト ベースであるため、ファイルは同等のバイナリ ファイルよりもはるかに大きくなります。また、多くの高価な解析と処理が必要です。そこで、OBJ モデルを独自の高性能バイナリ形式に変換するインポーターを開発しました。
ウェーブサウンドファイル
WAVは非常に一般的なサウンド ファイル形式です。さらに、ゲームで使用するのに非常に理想的です。したがって、この場合、カスタム形式は必要ありません。
3D グラフィックス
3D シーンを毎秒 30 回以上平均的な画面解像度にレンダリングするには、かなりの計算が必要です。この目的のために、 GPUが構築されました。非常に低レベルの言語を使用して GPU 用のあらゆる種類のプログラムを作成することは可能ですが、ほとんどの開発者はDirect3DやOpenGLなどの抽象化を使用します。これらの API は、GPU との通信方法を制限しながら、グラフィックス関連のタスクを大幅に簡素化します。
API を使用したレンダリング
私はこれまで Direct3D だけを扱ってきましたが、これは OpenGL にも当てはまるはずです。
先ほど言ったように、GPU はプログラムできます。Direct3D と OpenGL にはどちらも独自の GPU プログラミング言語、別名Shading Language : HLSL (Direct3D) とGLSLが付属しています。これらの言語の 1 つで書かれたプログラムはShaderと呼ばれます。
3D モデルをレンダリングする前に、グラフィックス デバイスをレンダリング用に準備する必要があります。これは、シェーダーとその他の効果状態をデバイスにバインドすることによって行われます。(これらはすべて API を使用して行われます。)
3D モデルは通常、一連の頂点として表されます。たとえば、長方形の場合は 4 つの頂点、立方体の場合は 8 つの頂点などです。これらの頂点は、複数のコンポーネントで構成されます。この場合の絶対最小値は、位置コンポーネント (3D 空間の X、Y、および Z オフセットを表す 3 つの浮動小数点数) です。また、位置は無限に小さい点です。そのため、さらに、ポイントをサーフェスに接続する方法を定義する必要があります。
頂点と三角形が定義されると、GPU のメモリに書き込むことができます。すべてが正しく設定されていれば、API を介して Draw Call を発行できます。GPU はシェーダーを実行し、すべての入力データを処理します。最後のステップで、レンダリングされた三角形が定義済みの出力 (たとえば、画面) に書き込まれます。
3D グラフィックスの行列
前に述べたように、3D メッシュは 3D 空間内の位置を持つ頂点で構成されます。この位置はすべて、オブジェクト空間と呼ばれる座標系に埋め込まれています。
オブジェクトをワールドに配置、移動、回転、スケーリングするには、これらの位置を変換する必要があります。言い換えれば、それらは別の座標系に埋め込まれなければならず、この場合はワールド空間と呼ばれます。
この変換を行う最も簡単で効率的な方法は、行列の乗算です。平行移動、回転、およびスケーリングの量から、4x4 行列が構築されます。この行列は、すべての頂点で乗算されます。(その背後にある数学は非常に興味深いものですが、この質問の範囲ではありません。)
オブジェクトとワールド空間の他に、ビュー空間(「カメラ」の座標系)、クリップ空間、スクリーン空間、タンジェント空間(オブジェクトの表面) もあります。ベクトルは、これらの座標系の間で非常に多く変換する必要があります。3D グラフィックスで行列が重要な理由がわかります。
ここからの続き方
面白いと思うトピックを見つけて、グーグルを始めてください。かなりの数のキーワードをお伝えしたと思います。具体的に言及されたトピックについて、ある程度のアイデアが得られたことを願っています。
StackExchange フレームワークには、この種の質問により適したゲーム開発サイトもあります。トップ投票の質問は、どの SE サイトでも常によく読まれます。