2014-01-06 70 views
1

我想創建一個非常基本的網格渲染器,使用D3D11在我的學校最終項目中使用。儘管我在rastertek網站和Frank De Luna的書中使用了最簡單的透視着色器等基本在線教程,但我無法讓我的三角形顯示在屏幕上。最後,我發現了VS 2013的圖形調試功能,並且我能夠看到我的頂點和索引緩衝區充滿了垃圾數據。如果您想運行代碼,我已經主持瞭解決方案here,但是熟悉D3D和/或其SharpDX C#包裝的人能否告訴我在下面的代碼中我做錯了什麼?基於SharpDX DataStream的緩衝區初始化失敗

這是我的幾何數據。頂點結構具有Vector4位置和顏色字段,索引是ushort的別名。

var vertices = new[] 
{ 
    new Vertex(new Vector4(-1, 1, 0, 1), Color.Red), 
    new Vertex(new Vector4(1, 1, 0, 1), Color.Green), 
    new Vertex(new Vector4(1, -1, 0, 1), Color.Blue), 
    new Vertex(new Vector4(-1, -1, 0, 1), Color.White) 
}; 
var indices = new Index[] 
{ 
    0, 2, 1, 
    0, 3, 2 
}; 

這裏是代碼未能初始化我的頂點和索引緩衝區與上述數據。

var vStream = new DataStream(sizeInBytes: vertices.Length * sizeof(Vertex), canRead: false, canWrite: true); 
var iStream = new DataStream(sizeInBytes: indices.Length * sizeof(Index), canRead: false, canWrite: true); 
{ 
    vStream.WriteRange(vertices); 
    iStream.WriteRange(indices); 
    vBuffer = new Buffer(
     device, vStream, new BufferDescription(
      vertices.Length * sizeof(Vertex), 
      ResourceUsage.Immutable, 
      BindFlags.VertexBuffer, 
      CpuAccessFlags.None, 
      ResourceOptionFlags.None, 
      0)) { DebugName = "Vertex Buffer" }; 
    iBuffer = new Buffer(
     device, iStream, new BufferDescription(
      indices.Length * sizeof(Index), 
      ResourceUsage.Immutable, 
      BindFlags.IndexBuffer, 
      CpuAccessFlags.None, 
      ResourceOptionFlags.None, 
      0)) { DebugName = "Index Buffer" }; 
} 

如果我用上面的代碼替換下面的代碼,但是,它的工作原理。我不知道我在做什麼錯。

vBuffer = Buffer.Create(
    device, vertices, new BufferDescription(
     vertices.Length * sizeof(Vertex), 
     ResourceUsage.Immutable, 
     BindFlags.VertexBuffer, 
     CpuAccessFlags.None, 
     ResourceOptionFlags.None, 
     0)); 
vBuffer.DebugName = "Vertex Buffer"; 
iBuffer = Buffer.Create(
    device, indices, new BufferDescription(
     indices.Length * sizeof(Index), 
     ResourceUsage.Immutable, 
     BindFlags.IndexBuffer, 
     CpuAccessFlags.None, 
     ResourceOptionFlags.None, 
     0)); 
iBuffer.DebugName = "Index Buffer"; 

回答

2

你需要將它傳遞給new Buffer(...)

+0

難以置信前流位置歸零(如iStream.Position = 0),它的工作原理!非常感謝。 – Drake