private void Draw( CommandEncoder commandEncoder, MeshEffect meshEffect, EffectPipelineStateHandle pipelineStateHandle, IEnumerable <ModelMeshMaterialPass> materialPasses, RenderInstanceData instanceData) { commandEncoder.SetVertexBuffer(2, instanceData.WorldBuffer); if (Skinned) { meshEffect.SetSkinningBuffer(instanceData.SkinningBuffer); meshEffect.SetNumBones(NumBones); } meshEffect.SetSkinningEnabled(Skinned); meshEffect.SetMaterials(_materialsBuffer); meshEffect.SetTextures(_textures); commandEncoder.SetVertexBuffer(0, _vertexBuffer); foreach (var materialPass in materialPasses) { meshEffect.SetTextureIndices(materialPass.TextureIndicesBuffer); meshEffect.SetMaterialIndices(materialPass.MaterialIndicesBuffer); meshEffect.SetNumTextureStages(materialPass.NumTextureStages); commandEncoder.SetVertexBuffer(1, materialPass.TexCoordVertexBuffer); foreach (var meshPart in materialPass.MeshParts) { if (meshPart.PipelineStateHandle != pipelineStateHandle) { continue; } meshEffect.SetPrimitiveOffset(meshPart.StartIndex / 3); meshEffect.SetAlphaTest(meshPart.AlphaTest); meshEffect.SetTexturing(meshPart.Texturing); meshEffect.Apply(commandEncoder); commandEncoder.DrawIndexedInstanced( PrimitiveType.TriangleList, meshPart.IndexCount, instanceData.NumInstances, _indexBuffer, meshPart.StartIndex); } } }