Platform SDK: DirectX |
三角形リストとは、個々の三角形のリストである。三角形は互いに隣接していても離れていてもよい。三角形リストには、少なくとも 3 つの頂点が必要である。頂点の総数は 3 の倍数でなければならない。
分離したパーツから構成されるオブジェクトを作成するときは、三角形リストを使用する。たとえば、3D ゲームで電磁力界壁を作成するには、単独の小さな三角形を多数集めたリストを指定する。次に、この三角形リストにマテリアルやテクスチャを適用して光を発しているように見せる。壁の三角形それぞれが輝いて見えるようになる。プレーヤーが電磁力界とはこう見えるだろうと期待するとおりに、壁の背後のシーンが三角形の間の隙間を通して部分的に見えるようになる。
また、三角形リストは、グーロー シェーディングで陰影を付けた、鋭いエッジを持つプリミティブを作成するときに便利である。「面法線ベクトルと頂点法線ベクトル」を参照すること。
C++ では、次のコードで示すように、頂点の配列に値を設定して三角形リストを作成する。
const DWORD TOTAL_VERTS=6; D3DVERTEX lpVerts[TOTAL_VERTS]; lpVerts[0] = D3DVERTEX(D3DVECTOR(-5,-5,0),D3DVECTOR(0,0,-1),0,0); lpVerts[1] = D3DVERTEX(D3DVECTOR(0,5,0),D3DVECTOR(0,0,-1),0,0); lpVerts[2] = D3DVERTEX(D3DVECTOR(5,-5,0),D3DVECTOR(0,0,-1),0,0); lpVerts[3] = D3DVERTEX(D3DVECTOR(10,5,0),D3DVECTOR(0,0,-1),0,0); lpVerts[4] = D3DVERTEX(D3DVECTOR(15,-5,0),D3DVECTOR(0,0,-1),0,0); lpVerts[5] = D3DVERTEX(D3DVECTOR(20,5,0),D3DVECTOR(0,0,-1),0,0);
IDirect3DDevice7::DrawPrimitive メソッドを使用して三角形リストをレンダリングする。次のコードは、IDirect3DDevice7::DrawPrimitive を使用して、上の例の三角形リストを描画する方法を示す。IDirect3DDevice7::DrawPrimitive の呼び出しは、IDirect3DDevice7::BeginScene と IDirect3DDevice7::EndScene の間で行う必要がある。
HRESULT hResult; // このコードでは、lpDirect3DDevice は IDirect3DDevice7 インターフェイスへの // 有効なポインタであるとする。 hResult = lpDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, D3DFVF_VERTEX, lpVerts, TOTAL_VERTS, D3DDP_WAIT);
Visual Basic では、次のコードで示すように、頂点の配列に値を設定して三角形リストを作成する。
' このコードでは、dx は DirectX7 オブジェクトへの ' 有効な参照であるとする。 On Local Error Resume Next Const TOTAL_VERTS As Integer = 6 Dim Verts(TOTAL_VERTS) As D3DVERTEX Verts(0) = dx.CreateD3DVertex(-5, -5, 0, 0, 0, -1, 0, 0) Verts(1) = dx.CreateD3DVertex(0, 5, 0, 0, 0, -1, 0, 0) Verts(2) = dx.CreateD3DVertex(5, -5, 0, 0, 0, -1, 0, 0) Verts(3) = dx.CreateD3DVertex(10, 5, 0, 0, 0, -1, 0, 0) Verts(4) = dx.CreateD3DVertex(15, -5, 0, 0, 0, -1, 0, 0) Verts(5) = dx.CreateD3DVertex(20, 5, 0, 0, 0, -1, 0, 0)
Direct3DDevice7.DrawPrimitive メソッドを使用して三角形リストをレンダリングする。次の例は、Direct3DDevice7.DrawPrimitive を使用して、上の例の三角形リストを描画する方法を示す。Direct3DDevice7.DrawPrimitive の呼び出しは、Direct3DDevice7.BeginScene と Direct3DDevice7.EndScene の間で行う必要がある。
' このコードでは、d3ddev は Direct3DDevice7 オブジェクトへの ' 有効な参照であるとする。 Call d3ddev.DrawPrimitive(D3DPT_TRIANGLELIST, _ D3DFVF_VERTEX, _ Verts(0), _ TOTAL_VERTS, _ D3DDP_WAIT) If Err.Number <> DD_OK Then ' エラー処理コード End If
次の図は、結果として描画される三角形リストを示す。