Direct3Dの複雑さが見えた前回に引き続き、今回は画面に表示させる頂点の用意をするところまで解説していきます。


1,頂点の構造体を用意する


 画面に三角形を描くことを目的としているため、まずはどのような三角形を描くかを定義する必要があります。

 Direct3Dでは、三角形自体に情報を与えずにそれを構成する3つの頂点1つ1つに情報を与えてそのような三角形にするのか定義します。

tri_vertex


 3つの頂点に別々に情報を与えて描画させると、Direct3Dは点の間の情報を補間して三角形内部の様子がしだいに移り変わっていくように描画してくれます。図の場合は色がグラデーションがかかったかのように描画されています。点の色を変えるだけでグラデーションできるなんて簡単でいいですね。

 この情報の補間機能ですが、色だけではなくほかにもテクスチャ座標や法線ベクトル等にも適応されます。そのことは今後扱っていきましょう。




 さて、三角形を作るには頂点を決めればいいということなので、まずは頂点1つをあらわす構造体を作成します。


[StructLayout(LayoutKind.Sequential)] public struct PositionColor { public Vector3 Position; public Vector4 Color; }

 Vector3やVector4型は、実数型floatを数個そなえているもので座標や色をあらわすときに使います。座標であれば順にx,y,zと割り当て、色であればr,g,b,aというように割り当てます。

 つまり、この構造体は頂点に座標と色を与えることができるそういった定義なわけです。


 構造体の前につけた
[StructLayout(LayoutKind.Sequential)]
は構造体の中身をメモリに記録する時に、定義した順に配置することを約束する属性です。おまじないなのでつけておきます。




2,頂点配列の作成

 構造体を定義し、頂点を表すことができるようになったため描画したい三角形の3つの頂点を表現したいと思います。

PositionColor[] tri_vertices = new PositionColor[3];

tri_vertices[0] = new PositionColor();
tri_vertices[0].Position = new Vector3(0f, 0.5f, 0f); //上
tri_vertices[0].Color = new Vector4(255f / 255f, 201f / 255f, 14f / 255f, 1f); //オレンジ

tri_vertices[1] = new PositionColor();
tri_vertices[1].Position = new Vector3(-0.5f, -0.5f, 0f); //左下
tri_vertices[1].Color = new Vector4(255f / 255f, 201f / 255f, 14f / 255f, 1f); //オレンジ

tri_vertices[2] = new PositionColor();
tri_vertices[2].Position = new Vector3(0.5f, -0.5f, 0f); //右下
tri_vertices[2].Color = new Vector4(255f / 255f, 0f / 255f, 0 / 255f, 1f); //赤

 先ほど定義した構造体の要素数3の配列を作成し、3つの頂点を決めました。座標や色は以下の形式に従って入力していきます。
vertex.Position = new Vector3(X座標, Y座標, Z座標);
vertex.Color = new Vector4(赤成分, 緑成分, 青成分, 透明度);
 ここで注意しなくてはならないことは、色成分は0~1の範囲に直さなければいけないことと、XYZ座標空間が多少変わっていることの2点です。
proj_space
 黒枠は、画面の枠です。そうしたとき画面の左上が(-1,1)、右下が(1,-1)となるような空間が設定されていてそこに三角形を配置していくことになります。間違っても画面のピクセル座標にあわせないようにしてください。

 この変わった座標配分の話は、今後変換行列のところですることになると思います。




3、まとめ

 今回で表示する三角形の頂点を定義することができました。次回はこの配列のデータをグラフィックボードに転送する処理を扱っていきます。