1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| private void SaveWithPBO( string Name )
{
int W = m_Width;
int H = m_Height;
int Bulle = m_PboRead;
m_PboRead = m_PboWrite;
m_PboWrite = Bulle;
GL.BindTexture( TextureTarget.TextureRectangle, m_TextureOut );
GL.BindFramebuffer( FramebufferTarget.Framebuffer, m_FBO );
GL.ReadBuffer( ReadBufferMode.ColorAttachment0 );
GL.BindBuffer( BufferTarget.PixelPackBuffer, m_PboWrite );
GL.ReadPixels( 0, 0, W, H, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero ); // demande de lecture non bloquante;
GL.BindBuffer( BufferTarget.PixelPackBuffer, m_PboRead );
IntPtr Data = GL.MapBuffer(BufferTarget.PixelPackBuffer, BufferAccess.ReadOnly); // lecture de la frame précédente
Bitmap bmp = new Bitmap(W, H);
BitmapData bmpdata = bmp.LockBits(new Rectangle(0, 0, W, H), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
IntPtr ptr = bmpdata.Scan0;
long size = (long)(W * H * 4 );
unsafe
{
Buffer.MemoryCopy( Data.ToPointer(), ptr.ToPointer(), size, size );
}
bmp.UnlockBits( bmpdata );
SaveToDisk( ref bmp, Name );
GL.UnmapBuffer( BufferTarget.PixelPackBuffer );
GL.BindBuffer( BufferTarget.PixelPackBuffer, 0 );
} |
Partager