0

InstancedModelSample コードを自分のゲームに実装しようとしていますが、1 つの問題を除いて完全に機能しています - 私の icospheres のエッジが間違った頂点の間に描画され、文字化けした混乱を描画しているだけです。

個々の Draw() 呼び出しで 300 ほどのモデルを描画していたときは、正常にレンダリングされましたが、この新しいコードではそうではありませんでした。私はこのようなことは初めてです - これが何にでも使える一般的な方法のように見える場合、どのようにして顔で正しいギャップを埋める方法を取得できますか?

以下の私のコードは、元のサンプルからわずかに調整されているだけで、私には必要のない部分 (骨の変換など) が除外されています。

    private void DrawSeriesOfModels(Model model, Matrix[] matrices, Matrix view, Matrix Projection)
    {
        // Set up vertex declaration.
        VertexDeclaration vertexDeclaration = new VertexDeclaration
        (
            new VertexElement(0, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 0),
            new VertexElement(16, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 1),
            new VertexElement(32, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 2),
            new VertexElement(48, VertexElementFormat.Vector4, VertexElementUsage.BlendWeight, 3)
        );

        // Set up dynamic vertic buffer.
        DynamicVertexBuffer vertexBuffer = new DynamicVertexBuffer(GraphicsDevice, vertexDeclaration, matrices.Length, BufferUsage.WriteOnly);

        // Transfer matrices into buffer.
        vertexBuffer.SetData(matrices, 0, matrices.Length, SetDataOptions.Discard);

        foreach (ModelMesh mesh in model.Meshes)
        {
            foreach (ModelMeshPart meshPart in mesh.MeshParts)
            {
                GraphicsDevice.SetVertexBuffers(new VertexBufferBinding(meshPart.VertexBuffer, meshPart.VertexOffset, 0),
                                                new VertexBufferBinding(vertexBuffer, 0, 1));

                // Set up instance rendering effect.
                Effect effect = meshPart.Effect;
                effect.CurrentTechnique = effect.Techniques["HardwareInstancing"];
                effect.Parameters["World"].SetValue(Matrix.Identity);
                effect.Parameters["View"].SetValue(view);
                effect.Parameters["Projection"].SetValue(Projection);
                effect.Parameters["AmbientLight"].SetValue(1);      // Make model solid white.


                // Draw everything in a single call.
                foreach (EffectPass pass in effect.CurrentTechnique.Passes)
                {
                    pass.Apply();
                    GraphicsDevice.DrawInstancedPrimitives(PrimitiveType.TriangleList, 0, 0, meshPart.NumVertices, meshPart.StartIndex, meshPart.PrimitiveCount, matrices.Length);
                }
            }
        }
        amountOfDraws++;
    }



私を助けてくれる人に前もって感謝します:)

4

1 に答える 1

0

わかりました、これは私の不注意によるものだと思いますが、他の誰かが同様の問題を抱えている可能性が少し低い場合、問題は私がその行を含めなかったことです

    GraphicsDevice.Indices = meshPart.IndexBuffer;

ラインの直後

    GraphicsDevice.SetVertexBuffers(new VertexBufferBinding(meshPart.VertexBuffer, meshPart.VertexOffset, 0),
                                            new VertexBufferBinding(vertexBuffer, 0, 1));

...悪い。

于 2014-08-21T21:43:31.090 に答える