예제 #1
0
        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;
            }
        }
예제 #2
0
        internal RenderBuffer(RenderbufferInternalFormat format)
        {
            this.Format = format;

            info.ID = -1;
            info.LastFramebuffer = -1;
        }
예제 #3
0
        /// <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));
        }
예제 #4
0
        public void Attach(RenderbufferInternalFormat format)
        {
            if (attachedFormats.Exists(f => f == format))
            {
                return;
            }

            attachedFormats.Add(format);
        }
예제 #5
0
        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);
        }
예제 #6
0
 public RenderBuffer(RenderbufferInternalFormat format)
 {
     Format = format;
 }
예제 #7
0
        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);
 }
예제 #9
0
        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.");
            }
        }
예제 #10
0
        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.");
            }
        }