SlimDX Direct3D 11索引问题

问题描述:

我试图使用SlimDX和Direct3D11绘制索引方块。我设法绘制了一个没有索引的正方形,但是当我切换到索引版本时,我只是得到一个空白屏幕。SlimDX Direct3D 11索引问题

我的输入布局设置为仅取位置数据(我本质上是从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); 

你为什么不只是使用一个顶点和indexbuffer这个简单例?

像这样(的DirectX9):

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

我用的是网以另一种方式(再次DirectX9的代码):

 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(); 
+0

的网格类不在Direct3D11命名空间中可用我'm使用(抱歉,应该说!),我的代码中的网格是我创建的结构。我不确定Direct3D9代码(我实际上最终计划将旧的MDX项目转换为在SlimDX Direct3D11中运行)转换为DX11的效果如何,但是我会付诸流水 – 2011-02-14 15:40:02