Example #1
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);
        }
Example #2
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);
        }
Example #3
0
 public SimpleDiffuse()
 {
     shaderProg     = new ShaderProg("diffuse_vs.glsl", "diffuse_fs.glsl", true);
     _uniformHelper = new UniformHelper();
 }
Example #4
0
 public Pbr()
 {
     shaderProg =  new ShaderProg("vs_norm.glsl", "fs_PBR_gltf_pipeline_with_maps.glsl", true);            
     _uniformHelper = new UniformHelper();
 }
Example #5
0
 private void TextUniformAdd_TextChanged(object sender, EventArgs e)
 {
     TextUniformAdd.BackColor = UniformHelper.IsNameValid(TextUniformAdd.Text) ? Color.PaleGreen : Color.LightSalmon;
 }