Esempio n. 1
0
        public void GetBackBufferData <T>(T[] data) where T : struct
        {
            // Store off the old frame buffer components
            uint prevReadBuffer = GLDevice.CurrentReadFramebuffer;

            GLDevice.BindReadFramebuffer(GLDevice.Backbuffer.Handle);
            GCHandle ptr = GCHandle.Alloc(data, GCHandleType.Pinned);

            try
            {
                GLDevice.glReadPixels(
                    0, 0,
                    GLDevice.Backbuffer.Width,
                    GLDevice.Backbuffer.Height,
                    OpenGLDevice.GLenum.GL_RGBA,
                    OpenGLDevice.GLenum.GL_UNSIGNED_BYTE,
                    ptr.AddrOfPinnedObject()
                    );
            }
            finally
            {
                ptr.Free();
            }

            // Restore old buffer components
            GLDevice.BindReadFramebuffer(prevReadBuffer);

            // Now we get to do a software-based flip! Yes, really! -flibit
            int width  = GLDevice.Backbuffer.Width;
            int height = GLDevice.Backbuffer.Height;
            int pitch  = width * 4 / Marshal.SizeOf(typeof(T));

            T[] tempRow = new T[pitch];
            for (int row = 0; row < height / 2; row += 1)
            {
                Array.Copy(data, row * pitch, tempRow, 0, pitch);
                Array.Copy(data, (height - row - 1) * pitch, data, row * pitch, pitch);
                Array.Copy(tempRow, 0, data, (height - row - 1) * pitch, pitch);
            }
        }