コード例 #1
0
        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++;
            }
        }