예제 #1
0
        /// <summary>
        /// Prepare VBO content and upload it to the GPU.
        /// </summary>
        private void PrepareDataBuffers()
        {
            if (useVBO &&
                scene != null &&
                scene.Triangles > 0)
            {
                GL.EnableClientState(ArrayCap.VertexArray);
                if (scene.HasNormals())
                {
                    GL.EnableClientState(ArrayCap.NormalArray);
                }
                if (scene.HasColors())
                {
                    GL.EnableClientState(ArrayCap.ColorArray);
                }

                // Vertex array: [color] [normal] coord
                GL.BindBuffer(BufferTarget.ArrayBuffer, VBOid[0]);
                int vertexBufferSize = scene.VertexBufferSize(true, false, true, true);
                GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)vertexBufferSize, IntPtr.Zero, BufferUsageHint.StaticDraw);
                IntPtr videoMemoryPtr = GL.MapBuffer(BufferTarget.ArrayBuffer, BufferAccess.WriteOnly);
                unsafe
                {
                    stride = scene.FillVertexBuffer((float *)videoMemoryPtr.ToPointer(), true, false, true, true);
                }
                GL.UnmapBuffer(BufferTarget.ArrayBuffer);
                GL.BindBuffer(BufferTarget.ArrayBuffer, 0);

                // Index buffer
                GL.BindBuffer(BufferTarget.ElementArrayBuffer, VBOid[1]);
                GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(scene.Triangles * 3 * sizeof(uint)), IntPtr.Zero, BufferUsageHint.StaticDraw);
                videoMemoryPtr = GL.MapBuffer(BufferTarget.ElementArrayBuffer, BufferAccess.WriteOnly);
                unsafe
                {
                    scene.FillIndexBuffer((uint *)videoMemoryPtr.ToPointer());
                }
                GL.UnmapBuffer(BufferTarget.ElementArrayBuffer);
                GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);
            }
            else
            {
                GL.DisableClientState(ArrayCap.VertexArray);
                GL.DisableClientState(ArrayCap.NormalArray);
                GL.DisableClientState(ArrayCap.ColorArray);

                if (useVBO)
                {
                    GL.BindBuffer(BufferTarget.ArrayBuffer, VBOid[0]);
                    GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)0, IntPtr.Zero, BufferUsageHint.StaticDraw);
                    GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
                    GL.BindBuffer(BufferTarget.ElementArrayBuffer, VBOid[1]);
                    GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)0, IntPtr.Zero, BufferUsageHint.StaticDraw);
                    GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);
                }
            }
        }