簡単な OpenGL ES 2.0 レンダラーの Direct3D 11 への移植
この移植作業では、基本から始めます。Visual Studio 2015 の DirectX 11 アプリ (ユニバーサル Windows) テンプレートに対応するように、頂点シェーディングされた回転する立方体の簡単なレンダラーを OpenGL ES 2.0 から Direct3D に移植します。 この移植プロセスでは、次について説明します。
- 一連の簡単な頂点バッファーを Direct3D の入力バッファーに移植する方法
- uniform と attribute を定数バッファーに移植する方法
- Direct3D のシェーダー オブジェクトを構成する方法
- Direct3D のシェーダー開発で基本的な HLSL セマンティクスを使う方法
- 非常に簡単な GLSL を HLSL に移植する方法
このトピックは、新しい DirectX 11 プロジェクトを作成したところから始まります。 新しい DirectX 11 プロジェクトを作成する方法については、「テンプレートからの DirectX ゲーム プロジェクトの作成」をご覧ください。
これらのリンクのどちらかから作成されたプロジェクトには Direct3D インフラストラクチャ用のコードがすべて用意されているため、OpenGL ES 2.0 から Direct3D 11 にレンダラーを移植するプロセスをすぐに始めることができます。
このトピックでは、2 つのコード パスについて説明します。どちらも同じ基本的なグラフィックス タスクを実行します。頂点シェーディングされた回転する立方体をウィンドウに表示するというものです。 どちらの場合も、コードは次のプロセスに対応しています。
- ハードコードされたデータから立方体のメッシュを作成する。 このメッシュは頂点の一覧として表され、各頂点では位置、法線ベクトル、色ベクトルを処理します。 シェーディング パイプラインで処理するためにこのメッシュを頂点バッファーに配置します。
- 立方体のメッシュを処理するシェーダー オブジェクトを作成する。 シェーダーは 2 つあります。1 つはラスタライズのために頂点を処理する頂点シェーダーで、もう 1 つはラスタライズ後に立方体の個々のピクセルに色を設定するフラグメント (ピクセル) シェーダーです。 これらのピクセルは、表示のためにレンダー ターゲットに書き込まれます。
- 頂点シェーダーとフラグメント シェーダーでそれぞれ処理する頂点とピクセルに使われるシェーダー言語を構成する。
- レンダリングされた立方体を画面に表示する。
このチュートリアルを終了すると、OpenGL ES 2.0 と Direct3D 11 の次の基本的な違いを理解できます。
- 頂点バッファーと頂点データの表現。
- シェーダーを作成して構成するプロセス。
- シェーダー言語と、シェーダー オブジェクトに対する入力と出力。
- 画面の描画動作。
このチュートリアルでは、次のように定義された単純で汎用的な OpenGL レンダラー構造を参照します。
typedef struct
{
GLfloat pos[3];
GLfloat rgba[4];
} Vertex;
typedef struct
{
// Integer handle to the shader program object.
GLuint programObject;
// The vertex and index buffers
GLuint vertexBuffer;
GLuint indexBuffer;
// Handle to the location of model-view-projection matrix uniform
GLint mvpLoc;
// Vertex and index data
Vertex *vertices;
GLuint *vertexIndices;
int numIndices;
// Rotation angle used for animation
GLfloat angle;
GLfloat mvpMatrix[4][4]; // the model-view-projection matrix itself
} Renderer;
この構造体には、インスタンスが 1 つあり、頂点シェーディングされた非常に簡単なメッシュをレンダリングするために必要なコンポーネントがすべて含まれています。
注 このトピックのすべての OpenGL ES 2.0 コードは、Khronos Group が提供する Windows API の実装に基づいており、Windows C プログラミング構文を使用しています。
知っておくべきこと
テクノロジ
- Microsoft Visual C++
- OpenGL ES 2.0
前提条件
- 任意。 「DXGI と Direct3D の EGL コードの比較」をご覧ください。 このトピックを読むと、DirectX によって提供されるグラフィックス インターフェイスについて理解を深めることができます。
ステップ
トピック | 説明 |
---|---|
OpenGL ES 2.0 から簡単なレンダラーを移植する場合、最初の手順では、Direct3D 11 の対応する頂点シェーダー オブジェクトとフラグメント シェーダー オブジェクトを設定し、コンパイル後にメイン プログラムがシェーダー オブジェクトと通信できるようにします。 |
|
この手順では、シェーダーが指定された順番で頂点を走査できるようにするインデックス バッファーとメッシュを格納する頂点バッファーを定義します。 |
|
バッファーとシェーダー オブジェクトを作成して構成するコードが完成したら、それらのシェーダー内のコードを OpenGL ES 2.0 の GL シェーダー言語 (GLSL) から Direct3D 11 の上位レベル シェーダー言語 (HLSL) に移植します。 |
|
最後に、回転する立方体を画面に描画するコードを移植します。 |
その他の情報