public void BindColor(long Key, int Attachment) { if (Texture.TryGetImage(Key, out ImageHandler Tex)) { EnsureFrameBuffer(); Attach(ref ColorAttachments[Attachment], Tex.Handle, FramebufferAttachment.ColorAttachment0 + Attachment); } else { UnbindColor(Attachment); } }
public void Reinterpret(long Key, GalImage NewImage) { if (!Texture.TryGetImage(Key, out GalImage OldImage)) { return; } if (NewImage.Format == OldImage.Format && NewImage.Width == OldImage.Width && NewImage.Height == OldImage.Height) { return; } if (CopyPBO == 0) { CopyPBO = GL.GenBuffer(); } GL.BindBuffer(BufferTarget.PixelPackBuffer, CopyPBO); //The buffer should be large enough to hold the largest texture. int BufferSize = Math.Max(ImageUtils.GetSize(OldImage), ImageUtils.GetSize(NewImage)); GL.BufferData(BufferTarget.PixelPackBuffer, BufferSize, IntPtr.Zero, BufferUsageHint.StreamCopy); if (!Texture.TryGetImageHandler(Key, out ImageHandler CachedImage)) { throw new InvalidOperationException(); } (_, PixelFormat Format, PixelType Type) = OGLEnumConverter.GetImageFormat(CachedImage.Format); GL.BindTexture(TextureTarget.Texture2D, CachedImage.Handle); GL.GetTexImage(TextureTarget.Texture2D, 0, Format, Type, IntPtr.Zero); GL.BindBuffer(BufferTarget.PixelPackBuffer, 0); GL.BindBuffer(BufferTarget.PixelUnpackBuffer, CopyPBO); GL.PixelStore(PixelStoreParameter.UnpackRowLength, OldImage.Width); Texture.Create(Key, ImageUtils.GetSize(NewImage), NewImage); GL.PixelStore(PixelStoreParameter.UnpackRowLength, 0); GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0); }
public void Reinterpret(long Key, GalImage NewImage) { if (!Texture.TryGetImage(Key, out GalImage OldImage)) { return; } if (NewImage.Format == OldImage.Format) { return; } if (CopyPBO == 0) { CopyPBO = GL.GenBuffer(); } GL.BindBuffer(BufferTarget.PixelPackBuffer, CopyPBO); GL.BufferData(BufferTarget.PixelPackBuffer, Math.Max(ImageUtils.GetSize(OldImage), ImageUtils.GetSize(NewImage)), IntPtr.Zero, BufferUsageHint.StreamCopy); if (!Texture.TryGetImageHandler(Key, out ImageHandler CachedImage)) { throw new InvalidOperationException(); } (_, PixelFormat Format, PixelType Type) = OGLEnumConverter.GetImageFormat(CachedImage.Format); GL.BindTexture(TextureTarget.Texture2D, CachedImage.Handle); GL.GetTexImage(TextureTarget.Texture2D, 0, Format, Type, IntPtr.Zero); GL.BindBuffer(BufferTarget.PixelPackBuffer, 0); GL.BindBuffer(BufferTarget.PixelUnpackBuffer, CopyPBO); Texture.Create(Key, ImageUtils.GetSize(NewImage), NewImage); GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0); }