SlimDXとDirect3D11を使用してインデックス付きの正方形を描画しようとしています。インデックスなしで正方形を描くことができましたが、インデックス付きのバージョンに切り替えると、空白の画面が表示されます。
私の入力レイアウトは、位置データのみを取得し(SlimDX Webサイトの3番目のチュートリアルから基本的に拡張しています)、三角形リストを描画するように設定されています。
私のレンダリングループコードは次のとおりです(チュートリアルのtriangle.fxピクセルと頂点シェーダーファイルを使用しています。これらは(画面座標で)頂点位置を取り、黄色にペイントします。D3DはSlimDX.Direct3D11の省略形です)
//clear the render target
context.ClearRenderTargetView(renderTarget, new Color4(0.5f, 0.5f, 1.0f));
context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(mesh.VertexBuffer,12, 0));
context.InputAssembler.SetIndexBuffer(mesh.IndexBuffer, Format.R16_UNorm, 0);
context.DrawIndexed(mesh.indices, 0, 0);
swapChain.Present(0, PresentFlags.None);
「メッシュ」は、頂点バッファー、インデックスバッファー、および頂点カウントを保持する構造体です。データはここに入力されます:
Vertex[] vertexes = new Vertex[4];
vertexes[0].Position = new Vector3(0, 0, 0.5f);
vertexes[1].Position = new Vector3(0, 0.5f, 0.5f);
vertexes[2].Position = new Vector3(0.5f, 0, 0.5f);
vertexes[3].Position = new Vector3(0.5f, 0.5f, 0.5f);
UInt16[] indexes = { 0, 1, 2, 1, 3, 2 };
DataStream vertices = new DataStream(12 * 4, true, true);
foreach (Vertex vertex in vertexes)
{
vertices.Write(vertex.Position);
}
vertices.Position = 0;
DataStream indices = new DataStream(sizeof(int) * 6, true, true);
foreach (UInt16 index in indexes)
{
indices.Write(index);
}
indices.Position = 0;
mesh = new Mesh();
D3D.Buffer vertexBuffer = new D3D.Buffer(device, vertices, 12 * 4, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
mesh.VertexBuffer = vertexBuffer;
mesh.IndexBuffer = new D3D.Buffer(device, indices, 2 * 6, ResourceUsage.Default, BindFlags.IndexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
mesh.vertices = vertexes.GetLength(0);
mesh.indices = indexes.Length;
これはすべて、インデックス付けされていない正方形の方法とほぼ同じです(インデックスバッファーとインデックスが追加され、インデックス付けに必要のない2つの重複する頂点が削除されています)が、インデックス付けされていないメソッドは正方形を描画しますが、インデックス付けされたメソッドは't。
私の現在の理論は、この行に何か問題があるというものです。
mesh.IndexBuffer = new D3D.Buffer(device, indices, 2 * 6, ResourceUsage.Default, BindFlags.IndexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
またはこれらの行:
context.InputAssembler.SetIndexBuffer(mesh.IndexBuffer, Format.R16_UNorm, 0);
context.DrawIndexed(mesh.indices, 0, 0);