示例#1
0
        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();
        }
示例#2
0
        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();
        }
示例#3
0
        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.");
            }
        }