我正在尝试使用 D3D11 创建一个非常基本的网格渲染器,以便在我的学校期末项目中使用。尽管我严格按照 rastertek 网站和 Frank De Luna 的书之类的基本在线教程,使用了可以想象到的最简单的直通着色器等,但我无法让我的三角形出现在屏幕上。最后我发现了 VS 2013 的图形调试能力,我能够看到我的顶点和索引缓冲区被垃圾数据填充。如果您想运行代码,我已经在此处托管了解决方案,但是熟悉 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";