/// <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); } } }