C# SlimDX Direct3D 11索引问题

C# SlimDX Direct3D 11索引问题,c#,graphics,indexing,direct3d,slimdx,C#,Graphics,Indexing,Direct3d,Slimdx,我正在尝试使用SlimDX和Direct3D11绘制一个索引正方形。我设法画了一个没有索引的正方形,但当我换成索引版本时,我只得到一个空白屏幕 我的输入布局设置为仅获取位置数据(我基本上是从SlimDX网站上的第三个教程扩展而来),并绘制三角形列表 我的渲染循环代码如下(我使用教程中的triangle.fx像素和顶点着色器文件,它们采用顶点位置(在屏幕坐标中)并将其绘制为黄色,D3D是SlimDX.Direct3D11的缩写) “网格”是一个包含顶点缓冲区、索引缓冲区和顶点计数的结构。数据填写如

我正在尝试使用SlimDX和Direct3D11绘制一个索引正方形。我设法画了一个没有索引的正方形,但当我换成索引版本时,我只得到一个空白屏幕

我的输入布局设置为仅获取位置数据(我基本上是从SlimDX网站上的第三个教程扩展而来),并绘制三角形列表

我的渲染循环代码如下(我使用教程中的triangle.fx像素和顶点着色器文件,它们采用顶点位置(在屏幕坐标中)并将其绘制为黄色,D3D是SlimDX.Direct3D11的缩写)

“网格”是一个包含顶点缓冲区、索引缓冲区和顶点计数的结构。数据填写如下:

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);

为什么不在这个简单的例子中使用顶点和索引缓冲区呢

像这样(Directx9):

我以另一种方式使用网格(再次使用directx9代码):

private void CreateMesh()
{
meshTerrain=新网格(设备,(宽度-1)*(高度-1)*2,宽度*高度,MeshFlags.Managed,PositionColored.Format);
DataStream stream=meshtrain.VertexBuffer.Lock(0,0,LockFlags.None);
stream.WriteRange(顶点);
meshtrain.VertexBuffer.Unlock();
stream.Close();
stream=meshtrain.IndexBuffer.Lock(0,0,LockFlags.None);
流写入(索引);
meshtrain.IndexBuffer.Unlock();
stream.Close();
网格地形生成比(0.5f);
网格地形.OptimizeInPlace(网格优化标志.VertexCache);
meshtrain=meshtrain.Clone(设备,MeshFlags.Dynamic,PositionNormalColored.Format);
meshtrain.ComputeNormals();
}
//绘图
设备.清除(ClearFlags.Target | ClearFlags.ZBuffer,Color.DarkSlateBlue,1.0f,0);
device.BeginScene();
device.VertexFormat=PositionColored.Format;
device.SetTransform(TransformState.World,Matrix.Translation(-HEIGHT/2,-WIDTH/2,0)*Matrix.RotationZ(angle));
int numSubSets=meshtrain.GetAttributeTable().Length;
对于(int i=0;i
Mesh类在我正在使用的Direct3D11命名空间中不可用(对不起,应该说!),我代码中的Mesh是我创建的结构。我不确定Direct3D9代码(我实际上最终计划将一个旧的MDX项目转换为在SlimDX Direct3D11中运行)转换为DX11的效果如何,但我会尝试一下下面列出的代码:
context.InputAssembler.SetIndexBuffer(mesh.IndexBuffer, Format.R16_UNorm, 0);
context.DrawIndexed(mesh.indices, 0, 0);
VertexBuffer vb;
IndexBuffer ib;

vertices = new PositionColored[WIDTH * HEIGHT];
//vertex creation
vb = new VertexBuffer(device, HEIGHT * WIDTH * PositionColored.SizeInBytes, Usage.WriteOnly, PositionColored.Format, Pool.Default);
DataStream stream = vb.Lock(0, 0, LockFlags.None);
stream.WriteRange(vertices);
vb.Unlock();

indices = new short[(WIDTH - 1) * (HEIGHT - 1) * 6];
//indicies creation
ib = new IndexBuffer(device, sizeof(int) * (WIDTH - 1) * (HEIGHT - 1) * 6, Usage.WriteOnly, Pool.Default, false);
DataStream stream = ib.Lock(0, 0, LockFlags.None);
stream.WriteRange(indices);
ib.Unlock();

//Drawing
device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.DarkSlateBlue, 1.0f, 0);
device.BeginScene();
device.VertexFormat = PositionColored.Format;
device.SetStreamSource(0, vb, 0, PositionColored.SizeInBytes);
device.Indices = ib;
device.SetTransform(TransformState.World, Matrix.Translation(-HEIGHT / 2, -WIDTH / 2, 0) * Matrix.RotationZ(angle));
device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, WIDTH * HEIGHT, 0, indices.Length / 3);
device.EndScene();
device.Present();
        private void CreateMesh()
        {
            meshTerrain = new Mesh(device, (WIDTH - 1) * (HEIGHT - 1) * 2, WIDTH * HEIGHT, MeshFlags.Managed, PositionColored.Format);
            DataStream stream = meshTerrain.VertexBuffer.Lock(0, 0, LockFlags.None);
            stream.WriteRange(vertices);
            meshTerrain.VertexBuffer.Unlock();
            stream.Close();
            stream = meshTerrain.IndexBuffer.Lock(0, 0, LockFlags.None);
            stream.WriteRange(indices);
            meshTerrain.IndexBuffer.Unlock();
            stream.Close();

            meshTerrain.GenerateAdjacency(0.5f);
            meshTerrain.OptimizeInPlace(MeshOptimizeFlags.VertexCache);

            meshTerrain = meshTerrain.Clone(device, MeshFlags.Dynamic, PositionNormalColored.Format);
            meshTerrain.ComputeNormals();
        }


        //Drawing
        device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.DarkSlateBlue, 1.0f, 0);    
        device.BeginScene();
        device.VertexFormat = PositionColored.Format;
        device.SetTransform(TransformState.World, Matrix.Translation(-HEIGHT / 2, -WIDTH / 2, 0) * Matrix.RotationZ(angle));

        int numSubSets = meshTerrain.GetAttributeTable().Length;
        for (int i = 0; i < numSubSets; i++)
        {
            meshTerrain.DrawSubset(i);
        }
        device.EndScene();
        device.Present();