public void DrawIndexed(int indexCount, int instanceCount, int firstIndex, int vertexOffset, int firstInstance) { m_CompiledPipelineProgram.InitializePipeline(); this.gl_InstanceIndex = firstInstance; this.CurrentStage = StageType.InputAssembler; int indiceIndex = firstIndex; int[] vertexIndex32 = new int[1]; UInt16[] vertexIndex16 = new ushort[1]; SoftwareDeviceMemory sdmIndex = (SoftwareDeviceMemory)m_context.m_CommandBuffer.m_context.m_IndexBuffer.m_deviceMemory; int indexMemOffset = m_context.m_CommandBuffer.m_context.m_IndexBuffer.m_memoryOffset; Func <int> getIndiceFunc; switch (m_context.m_CommandBuffer.m_context.m_IndexBufferType) { case VkIndexType.VK_INDEX_TYPE_UINT16: getIndiceFunc = () => { int srcOffset = indexMemOffset + (indiceIndex * 2); Buffer.BlockCopy(sdmIndex.m_bytes, srcOffset, vertexIndex16, 0, 2); return(vertexIndex16[0]); }; break; case VkIndexType.VK_INDEX_TYPE_UINT32: getIndiceFunc = () => { int srcOffset = indexMemOffset + (indiceIndex * 4); Buffer.BlockCopy(sdmIndex.m_bytes, srcOffset, vertexIndex32, 0, 4); return(vertexIndex32[0]); }; break; default: return; } for (int instanceNum = 0; instanceNum < instanceCount; instanceNum++) { indiceIndex = firstIndex; while (indexCount >= PrimitiveLength) { for (int i = 0; i < PrimitiveLength; i++) { this.PrimitiveVertexIndex = i; this.gl_VertexIndex = getIndiceFunc(); m_CompiledPipelineProgram.VertexShader(); indiceIndex++; } RasterizeTriangle(); indexCount -= this.PrimitiveLength; } this.gl_InstanceIndex++; } }