Exemplo n.º 1
0
        private int CalculateBRDF(ShaderProg shader, int framebuffer, int renderbuffer, int size = 512)
        {
            int  textureId = /*LoadBrdfImage("Resources/zB8UF1G.png");*/ AllocateBrdf(size);
            Quad quad      = new Quad();

            GL.BindFramebuffer(FramebufferTarget.Framebuffer, framebuffer);
            GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, renderbuffer);
            GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer,
                                   RenderbufferStorage.DepthComponent24, size, size);
            GL.FramebufferTexture2D(FramebufferTarget.Framebuffer,
                                    FramebufferAttachment.ColorAttachment0,
                                    TextureTarget.Texture2D,
                                    textureId, 0);
            ShaderProg brdfShader = shader;

            GL.UseProgram(brdfShader.ProgramID);
            brdfShader.EnableVertexAttribArrays();
            GL.Viewport(0, 0, size, size);
            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
            quad.RenderQuad();

            GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
            brdfShader.DisableVertexAttribArrays();

            return(textureId);
        }
Exemplo n.º 2
0
        private int TransformHdrToPrefilteredCubemap(int textureId, ShaderProg shader, int framebuffer, int renderbuffer, int size = 128, uint mipnapLevels = 5)
        {
            Cube cube = new Cube();

            GL.BindFramebuffer(FramebufferTarget.Framebuffer, framebuffer);

            GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, RenderbufferTarget.Renderbuffer, renderbuffer);

            int     cubemap    = AllocatePrefilterCubemap(size);
            Matrix4 projection = Matrix4.Identity;

            Matrix4[] views = new Matrix4[6];
            GenerateMatricesForMapHdrToCubemap(ref projection, ref views);

            ShaderProg prefilteredShader = shader;

            GL.UseProgram(prefilteredShader.ProgramID);
            prefilteredShader.EnableVertexAttribArrays();
            GL.UniformMatrix4(prefilteredShader.GetUniform("projection"), false, ref projection);
            UniformHelper helper = new UniformHelper();
            bool          suc;

            suc = helper.TryAddUniformTextureCubemap(textureId, "environmentMap", prefilteredShader, TextureUnit.Texture0);

            for (uint i = 0; i < mipnapLevels; ++i)
            {
                uint mipWidth  = (uint)(size * Math.Pow(0.5f, i));
                uint mipHeight = (uint)(size * Math.Pow(0.5f, i));

                GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, renderbuffer);
                GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferStorage.DepthComponent24, (int)mipWidth, (int)mipHeight);
                GL.Viewport(0, 0, (int)mipWidth, (int)mipHeight);

                float roughness = (float)i / (float)(mipnapLevels - 1);
                helper.TryAddUniform1(roughness, "roughness", prefilteredShader);
                GL.BindFramebuffer(FramebufferTarget.Framebuffer, framebuffer);
                // GL.Disable(EnableCap.FramebufferSrgb);
                //GL.ActiveTexture(TextureUnit.Texture0);
                for (uint j = 0; j < 6; ++j)
                {
                    GL.UniformMatrix4(prefilteredShader.GetUniform("view"), false, ref views[j]);
                    GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0,
                                            TextureTarget.TextureCubeMapPositiveX + (int)j, cubemap, (int)i);
                    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
                    //      GL.Enable(EnableCap.FramebufferSrgb);
                    cube.RenderCube(); // renders a 1x1 cube
                    // Console.WriteLine(GL.CheckNamedFramebufferStatus(framebuffer, FramebufferTarget.Framebuffer));
                }


                prefilteredShader.DisableVertexAttribArrays();
            }
            GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);

            return(cubemap);
        }
Exemplo n.º 3
0
        private int TransformHdrToCubemap(int textureId, string textureName, ShaderProg shader, int framebuffer, int renderbuffer, int size = 2048)
        {
            Cube cube = new Cube();

            GL.BindFramebuffer(FramebufferTarget.Framebuffer, framebuffer);
            GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, renderbuffer);
            GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferStorage.DepthComponent24, size, size);
            GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, RenderbufferTarget.Renderbuffer, renderbuffer);

            int     cubemap    = AllocateCubemap(size);
            Matrix4 projection = Matrix4.Identity;

            Matrix4[] views = new Matrix4[6];
            GenerateMatricesForMapHdrToCubemap(ref projection, ref views);

            ShaderProg equirectangularToCubemapShader = shader;

            GL.UseProgram(equirectangularToCubemapShader.ProgramID);
            equirectangularToCubemapShader.EnableVertexAttribArrays();
            GL.UniformMatrix4(equirectangularToCubemapShader.GetUniform("projection"), false, ref projection);
            UniformHelper helper = new UniformHelper();
            bool          suc;

            if (textureName == "equirectangularMap")
            {
                suc = helper.TryAddUniformTexture2D(textureId, textureName, equirectangularToCubemapShader, TextureUnit.Texture0);
            }
            else
            {
                suc = helper.TryAddUniformTextureCubemap(textureId, textureName, equirectangularToCubemapShader, TextureUnit.Texture0);
            }

            GL.Viewport(0, 0, size, size);
            GL.BindFramebuffer(FramebufferTarget.Framebuffer, framebuffer);
            GL.ActiveTexture(TextureUnit.Texture0);
            for (int i = 0; i < 6; ++i)
            {
                GL.UniformMatrix4(equirectangularToCubemapShader.GetUniform("view"), false, ref views[i]);
                GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0,
                                        TextureTarget.TextureCubeMapPositiveX + i, cubemap, 0);
                GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
                cube.RenderCube(); // renders a 1x1 cube
            }


            equirectangularToCubemapShader.DisableVertexAttribArrays();
            GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);

            return(cubemap);
        }