1

学校の最終プロジェクトで使用するために、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";
4

1 に答える 1

2

iStream.Position = 0に渡す前に、ストリーム位置をゼロにリセットする必要があります (のように)。new Buffer(...)

于 2014-01-07T02:20:02.943 に答える