Я пытаюсь нарисовать индексированный квадрат, используя SlimDX и Direct3D11. Мне удалось нарисовать квадрат без индексов, но когда я переключаюсь на свою индексированную версию, я просто вижу пустой экран.
Мой входной макет настроен так, чтобы он брал только данные о положении (я по сути продолжаю исходить из третьего руководства на веб-сайте SlimDX) и рисовал треугольные списки.
Мой код цикла рендеринга выглядит следующим образом (я использую файлы пиксельных и вершинных шейдеров 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;
Все это почти идентично моему неиндексированному квадратному методу (с добавлением индексных буферов и индексов и удалением двух повторяющихся вершин, которые не нужны при индексировании), но в то время как неиндексированный метод рисует квадрат, индексированный метод - нет.
Моя текущая теория заключается в том, что в этой строке либо что-то не так:
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);