public RenderBuffer(RenderbufferInternalFormat format) { this.format = format; renderBuffer = GL.GenRenderbuffer(); GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, renderBuffer); // OpenGL docs don't specify that this is required, but seems to be required on some platforms // to correctly attach in the GL.FramebufferRenderbuffer() call below GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, format, 1, 1); switch (format) { case RenderbufferInternalFormat.DepthComponent16: attachment = FramebufferAttachment.DepthAttachment; GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, attachment, RenderbufferTarget.Renderbuffer, renderBuffer); sizePerPixel = 2; break; case RenderbufferInternalFormat.Rgb565: case RenderbufferInternalFormat.Rgb5A1: case RenderbufferInternalFormat.Rgba4: attachment = FramebufferAttachment.ColorAttachment0; GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, attachment, RenderbufferTarget.Renderbuffer, renderBuffer); sizePerPixel = 2; break; case RenderbufferInternalFormat.StencilIndex8: attachment = FramebufferAttachment.StencilAttachment; GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, attachment, RenderbufferTarget.Renderbuffer, renderBuffer); sizePerPixel = 1; break; } }
internal RenderBuffer(RenderbufferInternalFormat format) { this.Format = format; info.ID = -1; info.LastFramebuffer = -1; }
/// <summary> /// Attaches a RenderBuffer to this framebuffer. /// </summary> /// <param name="format">The type of RenderBuffer to attach.</param> public void Attach(RenderbufferInternalFormat format) { if (attachedRenderBuffers.Exists(r => r.Format == format)) { return; } attachedRenderBuffers.Add(new RenderBuffer(format)); }
public void Attach(RenderbufferInternalFormat format) { if (attachedFormats.Exists(f => f == format)) { return; } attachedFormats.Add(format); }
public RenderBuffer(RenderbufferInternalFormat format) { this.format = format; renderBuffer = GL.GenRenderbuffer(); GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, renderBuffer); // OpenGL docs don't specify that this is required, but seems to be required on some platforms // to correctly attach in the GL.FramebufferRenderbuffer() call below GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, format, 1, 1); attachment = format.GetAttachmentType(); sizePerPixel = format.GetBytesPerPixel(); GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, attachment, RenderbufferTarget.Renderbuffer, renderBuffer); }
public RenderBuffer(RenderbufferInternalFormat format) { Format = format; }
private void SetupMultisampled() { // Generate texture target FBO if (this.handleMainFBO == 0) { GL.GenFramebuffers(1, out this.handleMainFBO); } GL.BindFramebuffer(FramebufferTarget.Framebuffer, this.handleMainFBO); // Attach textures int oglWidth = 0; int oglHeight = 0; for (int i = 0; i < this.targetInfos.Count; i++) { NativeTexture tex = this.targetInfos[i].Target; FramebufferSlot attachment = (FramebufferSlot)((int)FramebufferSlot.ColorAttachment0 + i); GL.FramebufferTexture2D( FramebufferTarget.Framebuffer, attachment, TextureTarget.Texture2D, tex.Handle, 0); oglWidth = tex.Width; oglHeight = tex.Height; } // Check status FramebufferErrorCode status = GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer); if (status != FramebufferErrorCode.FramebufferComplete) { throw new BackendException(string.Format("Incomplete Framebuffer: {0}", status)); } // Generate rendering FBO if (this.handleMsaaFBO == 0) { GL.GenFramebuffers(1, out this.handleMsaaFBO); } GL.BindFramebuffer(FramebufferTarget.Framebuffer, this.handleMsaaFBO); // Attach color renderbuffers for (int i = 0; i < this.targetInfos.Count; i++) { TargetInfo info = this.targetInfos.Data[i]; FramebufferSlot attachment = (FramebufferSlot)((int)FramebufferSlot.ColorAttachment0 + i); RenderbufferInternalFormat rbColorFormat = TexFormatToRboFormat(info.Target.Format); if (info.HandleMsaaColorRBO == 0) { GL.GenRenderbuffers(1, out info.HandleMsaaColorRBO); } GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, info.HandleMsaaColorRBO); GL.RenderbufferStorageMultisample(RenderbufferTarget.Renderbuffer, this.samples, rbColorFormat, oglWidth, oglHeight); GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, attachment, RenderbufferTarget.Renderbuffer, info.HandleMsaaColorRBO); this.targetInfos.Data[i] = info; } GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, 0); // Generate or delete depth renderbuffer if (this.depthBuffer) { if (this.handleDepthRBO == 0) { GL.GenRenderbuffers(1, out this.handleDepthRBO); } GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, this.handleDepthRBO); GL.RenderbufferStorageMultisample(RenderbufferTarget.Renderbuffer, this.samples, RenderbufferInternalFormat.DepthComponent24, oglWidth, oglHeight); GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferSlot.DepthAttachment, RenderbufferTarget.Renderbuffer, this.handleDepthRBO); GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, 0); } else { GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferSlot.DepthAttachment, RenderbufferTarget.Renderbuffer, 0); if (this.handleDepthRBO != 0) { GL.DeleteRenderbuffers(1, ref this.handleDepthRBO); } this.handleDepthRBO = 0; } // Check status status = GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer); if (status != FramebufferErrorCode.FramebufferComplete) { throw new BackendException(string.Format("Incomplete Multisample Framebuffer: {0}", status)); } GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); }
internal void Attach(RenderbufferInternalFormat format) { frameBuffer.Attach(format); }
public static int GetBytesPerPixel(this RenderbufferInternalFormat format) { // cross-reference: https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml switch (format) { // GL_RED case RenderbufferInternalFormat.R8: case RenderbufferInternalFormat.R8Snorm: return(1); case RenderbufferInternalFormat.R16f: return(2); case RenderbufferInternalFormat.R32f: return(4); // GL_RED_INTEGER case RenderbufferInternalFormat.R8ui: case RenderbufferInternalFormat.R8i: return(1); case RenderbufferInternalFormat.R16ui: case RenderbufferInternalFormat.R16i: return(2); case RenderbufferInternalFormat.R32ui: case RenderbufferInternalFormat.R32i: return(4); // GL_RG case RenderbufferInternalFormat.Rg8: case RenderbufferInternalFormat.Rg8Snorm: return(2); case RenderbufferInternalFormat.Rg16f: return(4); case RenderbufferInternalFormat.Rg32f: return(8); // GL_RG_INTEGER case RenderbufferInternalFormat.Rg8ui: case RenderbufferInternalFormat.Rg8i: return(2); case RenderbufferInternalFormat.Rg16ui: case RenderbufferInternalFormat.Rg16i: return(4); case RenderbufferInternalFormat.Rg32ui: case RenderbufferInternalFormat.Rg32i: return(8); // GL_RGB case RenderbufferInternalFormat.Rgb8: case RenderbufferInternalFormat.Srgb8: return(3); case RenderbufferInternalFormat.Rgb565: return(2); case RenderbufferInternalFormat.Rgb8Snorm: return(3); case RenderbufferInternalFormat.R11fG11fB10f: case RenderbufferInternalFormat.Rgb9E5: return(4); case RenderbufferInternalFormat.Rgb16f: return(6); case RenderbufferInternalFormat.Rgb32f: return(12); // GL_RGB_INTEGER case RenderbufferInternalFormat.Rgb8ui: case RenderbufferInternalFormat.Rgb8i: return(3); case RenderbufferInternalFormat.Rgb16ui: case RenderbufferInternalFormat.Rgb16i: return(6); case RenderbufferInternalFormat.Rgb32ui: case RenderbufferInternalFormat.Rgb32i: return(12); // GL_RGBA case RenderbufferInternalFormat.Rgba8: case RenderbufferInternalFormat.Srgb8Alpha8: case RenderbufferInternalFormat.Rgba8Snorm: return(4); case RenderbufferInternalFormat.Rgb5A1: case RenderbufferInternalFormat.Rgba4: return(2); case RenderbufferInternalFormat.Rgb10A2: return(4); case RenderbufferInternalFormat.Rgba16f: return(8); case RenderbufferInternalFormat.Rgba32f: return(16); // GL_RGBA_INTEGER case RenderbufferInternalFormat.Rgba8i: case RenderbufferInternalFormat.Rgba8ui: case RenderbufferInternalFormat.Rgb10A2ui: return(4); case RenderbufferInternalFormat.Rgba16i: case RenderbufferInternalFormat.Rgba16ui: return(8); case RenderbufferInternalFormat.Rgba32i: case RenderbufferInternalFormat.Rgba32ui: return(16); // GL_DEPTH_COMPONENT case RenderbufferInternalFormat.DepthComponent16: return(2); case RenderbufferInternalFormat.DepthComponent24: return(3); case RenderbufferInternalFormat.DepthComponent32f: return(4); // GL_DEPTH_STENCIL case RenderbufferInternalFormat.Depth24Stencil8: return(4); case RenderbufferInternalFormat.Depth32fStencil8: return(5); case RenderbufferInternalFormat.StencilIndex8: return(1); default: throw new InvalidOperationException($"{format} is not a valid {nameof(RenderbufferInternalFormat)} type."); } }
public static FramebufferAttachment GetAttachmentType(this RenderbufferInternalFormat format) { switch (format) { case RenderbufferInternalFormat.R8: case RenderbufferInternalFormat.R8Snorm: case RenderbufferInternalFormat.R16f: case RenderbufferInternalFormat.R32f: case RenderbufferInternalFormat.R8ui: case RenderbufferInternalFormat.R8i: case RenderbufferInternalFormat.R16ui: case RenderbufferInternalFormat.R16i: case RenderbufferInternalFormat.R32ui: case RenderbufferInternalFormat.R32i: case RenderbufferInternalFormat.Rg8: case RenderbufferInternalFormat.Rg8Snorm: case RenderbufferInternalFormat.Rg16f: case RenderbufferInternalFormat.Rg32f: case RenderbufferInternalFormat.Rg8ui: case RenderbufferInternalFormat.Rg8i: case RenderbufferInternalFormat.Rg16ui: case RenderbufferInternalFormat.Rg16i: case RenderbufferInternalFormat.Rg32ui: case RenderbufferInternalFormat.Rg32i: case RenderbufferInternalFormat.Rgb8: case RenderbufferInternalFormat.Srgb8: case RenderbufferInternalFormat.Rgb565: case RenderbufferInternalFormat.Rgb8Snorm: case RenderbufferInternalFormat.R11fG11fB10f: case RenderbufferInternalFormat.Rgb9E5: case RenderbufferInternalFormat.Rgb16f: case RenderbufferInternalFormat.Rgb32f: case RenderbufferInternalFormat.Rgb8ui: case RenderbufferInternalFormat.Rgb8i: case RenderbufferInternalFormat.Rgb16ui: case RenderbufferInternalFormat.Rgb16i: case RenderbufferInternalFormat.Rgb32ui: case RenderbufferInternalFormat.Rgb32i: case RenderbufferInternalFormat.Rgba8: case RenderbufferInternalFormat.Srgb8Alpha8: case RenderbufferInternalFormat.Rgba8Snorm: case RenderbufferInternalFormat.Rgb5A1: case RenderbufferInternalFormat.Rgba4: case RenderbufferInternalFormat.Rgb10A2: case RenderbufferInternalFormat.Rgba16f: case RenderbufferInternalFormat.Rgba32f: case RenderbufferInternalFormat.Rgba8i: case RenderbufferInternalFormat.Rgba8ui: case RenderbufferInternalFormat.Rgb10A2ui: case RenderbufferInternalFormat.Rgba16i: case RenderbufferInternalFormat.Rgba16ui: case RenderbufferInternalFormat.Rgba32i: case RenderbufferInternalFormat.Rgba32ui: return(FramebufferAttachment.ColorAttachment0); case RenderbufferInternalFormat.DepthComponent16: case RenderbufferInternalFormat.DepthComponent24: case RenderbufferInternalFormat.DepthComponent32f: return(FramebufferAttachment.DepthAttachment); case RenderbufferInternalFormat.StencilIndex8: return(FramebufferAttachment.StencilAttachment); case RenderbufferInternalFormat.Depth24Stencil8: case RenderbufferInternalFormat.Depth32fStencil8: return(FramebufferAttachment.DepthStencilAttachment); default: throw new InvalidOperationException($"{format} is not a valid {nameof(RenderbufferInternalFormat)} type."); } }