public FrameBuffer(Size size, ITextureInternal texture, Color clearColor) { this.size = size; this.clearColor = clearColor; if (!Exts.IsPowerOf2(size.Width) || !Exts.IsPowerOf2(size.Height)) { throw new InvalidDataException("Frame buffer size ({0}x{1}) must be a power of two".F(size.Width, size.Height)); } OpenGL.glGenFramebuffers(1, out framebuffer); OpenGL.CheckGLError(); OpenGL.glBindFramebuffer(OpenGL.GL_FRAMEBUFFER, framebuffer); OpenGL.CheckGLError(); // Color this.texture = texture; texture.SetEmpty(size.Width, size.Height); OpenGL.glFramebufferTexture2D(OpenGL.GL_FRAMEBUFFER, OpenGL.GL_COLOR_ATTACHMENT0, OpenGL.GL_TEXTURE_2D, texture.ID, 0); OpenGL.CheckGLError(); // Depth OpenGL.glGenRenderbuffers(1, out depth); OpenGL.CheckGLError(); OpenGL.glBindRenderbuffer(OpenGL.GL_RENDERBUFFER, depth); OpenGL.CheckGLError(); var glDepth = OpenGL.Profile == GLProfile.Embedded ? OpenGL.GL_DEPTH_COMPONENT16 : OpenGL.GL_DEPTH_COMPONENT; OpenGL.glRenderbufferStorage(OpenGL.GL_RENDERBUFFER, glDepth, size.Width, size.Height); OpenGL.CheckGLError(); OpenGL.glFramebufferRenderbuffer(OpenGL.GL_FRAMEBUFFER, OpenGL.GL_DEPTH_ATTACHMENT, OpenGL.GL_RENDERBUFFER, depth); OpenGL.CheckGLError(); // Test for completeness var status = OpenGL.glCheckFramebufferStatus(OpenGL.GL_FRAMEBUFFER); if (status != OpenGL.GL_FRAMEBUFFER_COMPLETE) { var error = "Error creating framebuffer: {0}\n{1}".F(status, new StackTrace()); OpenGL.WriteGraphicsLog(error); throw new InvalidOperationException("OpenGL Error: See graphics.log for details."); } // Restore default buffer OpenGL.glBindFramebuffer(OpenGL.GL_FRAMEBUFFER, 0); OpenGL.CheckGLError(); }
public FrameBuffer(Size size) { this.size = size; if (!Exts.IsPowerOf2(size.Width) || !Exts.IsPowerOf2(size.Height)) { throw new InvalidDataException("Frame buffer size ({0}x{1}) must be a power of two".F(size.Width, size.Height)); } OpenGL.glGenFramebuffers(1, out framebuffer); OpenGL.CheckGLError(); OpenGL.glBindFramebuffer(OpenGL.FRAMEBUFFER_EXT, framebuffer); OpenGL.CheckGLError(); // Color texture = new Texture(); texture.SetEmpty(size.Width, size.Height); OpenGL.glFramebufferTexture2D(OpenGL.FRAMEBUFFER_EXT, OpenGL.COLOR_ATTACHMENT0_EXT, OpenGL.GL_TEXTURE_2D, texture.ID, 0); OpenGL.CheckGLError(); // Depth OpenGL.glGenRenderbuffers(1, out depth); OpenGL.CheckGLError(); OpenGL.glBindRenderbuffer(OpenGL.RENDERBUFFER_EXT, depth); OpenGL.CheckGLError(); OpenGL.glRenderbufferStorage(OpenGL.RENDERBUFFER_EXT, OpenGL.GL_DEPTH_COMPONENT, size.Width, size.Height); OpenGL.CheckGLError(); OpenGL.glFramebufferRenderbuffer(OpenGL.FRAMEBUFFER_EXT, OpenGL.DEPTH_ATTACHMENT_EXT, OpenGL.RENDERBUFFER_EXT, depth); OpenGL.CheckGLError(); // Test for completeness var status = OpenGL.glCheckFramebufferStatus(OpenGL.FRAMEBUFFER_EXT); if (status != OpenGL.FRAMEBUFFER_COMPLETE_EXT) { var error = "Error creating framebuffer: {0}\n{1}".F(status, new StackTrace()); OpenGL.WriteGraphicsLog(error); throw new InvalidOperationException("OpenGL Error: See graphics.log for details."); } // Restore default buffer OpenGL.glBindFramebuffer(OpenGL.FRAMEBUFFER_EXT, 0); OpenGL.CheckGLError(); }