SharpDX基于DataStream的缓冲区初始化失败

时间:2014-01-06 18:23:46

标签: c# sharpdx direct3d11

我正在尝试创建一个非常基本的网格渲染器,使用D3D11在我的学校最终项目中使用。虽然我按照rastertek网站和Frank De Luna的书中的基本在线教程,使用了可以想象的最简单的直通着色器等,但我无法让我的三角形显示在屏幕上。最后我发现了VS 2013的图形调试能力,我能够看到我的顶点和索引缓冲区充满了垃圾数据。如果你想运行代码,我已经托管了解决方案here,但熟悉D3D和/或其SharpDX C#包装的人能否告诉我在下面的代码中我做错了什么?

这是我的几何数据。 Vertex结构具有Vector4位置和颜色字段,而Index是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";

1 个答案:

答案 0 :(得分:2)

您需要将流位置重置为零(如iStream.Position = 0),然后再将其传递给new Buffer(...)