Table of Contents

頂点の描画

上級 プログラマー

シーンを読み込む際、Stride は、エンティティシステムを介してシーンを表示するための描画呼び出しを自動的に処理します。このページでは、手動で描画する方法について紹介します。

プリミティブ

Stride には、次のような組み込みプリミティブが用意されています。

  • Plane(プレーン/平面)
  • Cube(キューブ/立方体)
  • Sphere(スフィア/球体)
  • Geosphere(ジオスフィア/天球体)
  • Cylinder(シリンダー/円柱)
  • Torus(トールス/円環体)
  • Teapot(ティーポット/きゅうす)

これらは GraphicsDevice と一緒に自動作成されたりはしないので、手動でインスタンス化する必要があります。これは、@'Stride.Graphics.GeometricPrimitive.GeometricPrimitive' クラスで行うことができます。

コード: プリミティブの作成と使用

// 生成
// creation
var myCube = GeometricPrimitive.Cube.New(GraphicsDevice);
var myTorus = GeometricPrimitive.Torus.New(GraphicsDevice);
 
// ...

// 画面上に描画 
// draw one on screen
myCube.Draw(CommandList, EffectInstance);

これらは関連付けられたエフェクトを持っていないので、描画時に手動で EffectInstanceを提供する必要があります。エフェクトの読み込みの詳細については、エフェクトとシェーダーを参照してください。

カスタム描画

組込みプリミティブの他に、カスタム頂点バッファを作成することでジオメトリを描画することができます。頂点バッファを作成するには、まず VertexDeclaration を定義する必要があります。この頂点宣言では、各頂点の要素と、そのレイアウトを記述します。 詳細については、VertexElement のリファレンスをご覧ください。

次に、頂点の配列から頂点バッファを作成することができます。頂点データ型は、VertexDeclaration と一致する必要があります。

頂点バッファと頂点宣言を使って、VertexBufferBinding を作成することができます。

コード: 頂点バッファを作成する

// 位置とテクスチャ座標を持つ頂点レイアウトの作成
// Create a vertex layout with position and texture coordinate
var layout = new VertexDeclaration(VertexElement.Position<Vector3>(), VertexElement.TextureCoordinate<Vector2>()); 

// 頂点の配列から頂点バッファの作成
// Create the vertex buffer from an array of vertices
var vertices = new VertexPositionTexture[vertexCount];
var vertexBuffer = Buffer.Vertex.New(GraphicsDevice, vertices);

// 頂点バッファバインディングの作成
// Create a vertex buffer binding
var vertexBufferBinding = new VertexBufferBinding(vertexBuffer, layout, vertexCount);

新しく作成した頂点バッファを描画するには、パイプラインにバインドする必要があります。描画する頂点レイアウトと PrimitiveType は、パイプライン ステートオブジェクトに含まれていなければなりません。バッファ自体は動的に設定することができます。

その後、Draw(int, int) を使って、頂点のレンダリングが行えます。

コード: 頂点バッファのバインドと描画

// パイプラインステートの設定
// Set the pipeline state
pipelineStateDescription.InputElements = vertexBufferBinding.Layout.CreateInputElements();
pipelineStateDescription.PrimitiveType = PrimitiveType.TriangleStrip;
 
// PipelineState オブジェクトの集合を作成
// Create and set a PipelineState object
// ...

// 頂点バッファをパイプラインにバインド
// Bind the vertex buffer to the pipeline
commandList.SetVertexBuffers(0, vertexBuffer, 0, vertexBufferBinding.Stride);

// 頂点を描画 
// Draw the vertices
commandList.Draw(vertexCount);

また、インデックス付きのジオメトリを描画することも可能です。インデックスバッファを使うには、まず頂点バッファと同じようにインデックスバッファを作成し、パイプラインにバインドします。 その後、DrawIndexed(int, int, int) を使って描画することができます。

コード: インデックス付き頂点の描画

// インデックスバッファの作成
// Create the index buffer
var indices = new short[indexCount];
var is32Bits = false;
var indexBuffer = Buffer.Index.New(GraphicsDevice, indices);
 
// 頂点配列の設定
// set the VAO
commandList.SetIndexBuffer(indexBuffer, 0, is32Bits);

// インデックス付き頂点の描画
// Draw indexed vertices
commandList.DrawIndexed(indexBuffer.ElementCount);