下面的代码只对原始示例进行了轻微调整,我可以看到对我来说不需要的部分(如骨转换)被排除。
我正试图将InstancedModelSample代码实现到我的游戏中,除了一个问题之外,它的工作非常完美-我的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++;
}
提前感谢任何可以帮助我的人:)
好吧,恐怕这是我的粗心大意,但在别人有类似问题的轻微机会,问题是我没有包括
行 GraphicsDevice.Indices = meshPart.IndexBuffer;
在
行之后 GraphicsDevice.SetVertexBuffers(new VertexBufferBinding(meshPart.VertexBuffer, meshPart.VertexOffset, 0),
new VertexBufferBinding(vertexBuffer, 0, 1));
…我的坏。