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(); }
public static void Initialize() { // glGetError and glGetString are used in our error handlers // so we want these to be available early. try { glGetError = Bind<GetError>("glGetError"); glGetStringInternal = Bind<GetString>("glGetString"); } catch (Exception) { throw new InvalidProgramException("Failed to initialize low-level OpenGL bindings. GPU information is not available"); } DetectGLFeatures(); if (!Features.HasFlag(GLFeatures.GL2OrGreater) || !Features.HasFlag(GLFeatures.FramebufferExt)) { WriteGraphicsLog("Unsupported OpenGL version: " + glGetString(OpenGL.GL_VERSION)); throw new InvalidProgramException("OpenGL Version Error: See graphics.log for details."); } else Console.WriteLine("OpenGL version: " + glGetString(OpenGL.GL_VERSION)); try { glFlush = Bind<Flush>("glFlush"); glViewport = Bind<Viewport>("glViewport"); glClear = Bind<Clear>("glClear"); glClearColor = Bind<ClearColor>("glClearColor"); glGetIntegerv = Bind<GetIntegerv>("glGetIntegerv"); glFinish = Bind<Finish>("glFinish"); glCreateProgram = Bind<CreateProgram>("glCreateProgram"); glUseProgram = Bind<UseProgram>("glUseProgram"); glGetProgramiv = Bind<GetProgramiv>("glGetProgramiv"); glCreateShader = Bind<CreateShader>("glCreateShader"); glShaderSource = Bind<ShaderSource>("glShaderSource"); glCompileShader = Bind<CompileShader>("glCompileShader"); glGetShaderiv = Bind<GetShaderiv>("glGetShaderiv"); glAttachShader = Bind<AttachShader>("glAttachShader"); glGetShaderInfoLog = Bind<GetShaderInfoLog>("glGetShaderInfoLog"); glLinkProgram = Bind<LinkProgram>("glLinkProgram"); glGetProgramInfoLog = Bind<GetProgramInfoLog>("glGetProgramInfoLog"); glGetUniformLocation = Bind<GetUniformLocation>("glGetUniformLocation"); glGetActiveUniform = Bind<GetActiveUniform>("glGetActiveUniform"); glUniform1i = Bind<Uniform1i>("glUniform1i"); glUniform1f = Bind<Uniform1f>("glUniform1f"); glUniform2f = Bind<Uniform2f>("glUniform2f"); glUniform1fv = Bind<Uniform1fv>("glUniform1fv"); glUniform2fv = Bind<Uniform2fv>("glUniform2fv"); glUniform3fv = Bind<Uniform3fv>("glUniform3fv"); glUniform4fv = Bind<Uniform4fv>("glUniform4fv"); glUniformMatrix4fv = Bind<UniformMatrix4fv>("glUniformMatrix4fv"); glGenBuffers = Bind<GenBuffers>("glGenBuffers"); glBindBuffer = Bind<BindBuffer>("glBindBuffer"); glBufferData = Bind<BufferData>("glBufferData"); glBufferSubData = Bind<BufferSubData>("glBufferSubData"); glDeleteBuffers = Bind<DeleteBuffers>("glDeleteBuffers"); glBindAttribLocation = Bind<BindAttribLocation>("glBindAttribLocation"); glVertexAttribPointer = Bind<VertexAttribPointer>("glVertexAttribPointer"); glEnableVertexAttribArray = Bind<EnableVertexAttribArray>("glEnableVertexAttribArray"); glDisableVertexAttribArray = Bind<DisableVertexAttribArray>("glDisableVertexAttribArray"); glDrawArrays = Bind<DrawArrays>("glDrawArrays"); glEnable = Bind<Enable>("glEnable"); glDisable = Bind<Disable>("glDisable"); glBlendEquation = Bind<BlendEquation>("glBlendEquation"); glBlendFunc = Bind<BlendFunc>("glBlendFunc"); glScissor = Bind<Scissor>("glScissor"); glPushClientAttrib = Bind<PushClientAttrib>("glPushClientAttrib"); glPopClientAttrib = Bind<PopClientAttrib>("glPopClientAttrib"); glPixelStoref = Bind<PixelStoref>("glPixelStoref"); glReadPixels = Bind<ReadPixels>("glReadPixels"); glGenTextures = Bind<GenTextures>("glGenTextures"); glDeleteTextures = Bind<DeleteTextures>("glDeleteTextures"); glBindTexture = Bind<BindTexture>("glBindTexture"); glActiveTexture = Bind<ActiveTexture>("glActiveTexture"); glTexImage2D = Bind<TexImage2D>("glTexImage2D"); glGetTexImage = Bind<GetTexImage>("glGetTexImage"); glTexParameteri = Bind<TexParameteri>("glTexParameteri"); glTexParameterf = Bind<TexParameterf>("glTexParameterf"); glGenFramebuffers = Bind<GenFramebuffers>("glGenFramebuffersEXT"); glBindFramebuffer = Bind<BindFramebuffer>("glBindFramebufferEXT"); glFramebufferTexture2D = Bind<FramebufferTexture2D>("glFramebufferTexture2DEXT"); glDeleteFramebuffers = Bind<DeleteFramebuffers>("glDeleteFramebuffersEXT"); glGenRenderbuffers = Bind<GenRenderbuffers>("glGenRenderbuffersEXT"); glBindRenderbuffer = Bind<BindRenderbuffer>("glBindRenderbufferEXT"); glRenderbufferStorage = Bind<RenderbufferStorage>("glRenderbufferStorageEXT"); glDeleteRenderbuffers = Bind<DeleteRenderbuffers>("glDeleteRenderbuffersEXT"); glFramebufferRenderbuffer = Bind<FramebufferRenderbuffer>("glFramebufferRenderbufferEXT"); glCheckFramebufferStatus = Bind<CheckFramebufferStatus>("glCheckFramebufferStatusEXT"); } catch (Exception e) { OpenGL.WriteGraphicsLog("Failed to initialize OpenGL bindings.\nInner exception was: {0}".F(e)); throw new InvalidProgramException("Failed to initialize OpenGL. See graphics.log for details."); } }