Exemplo n.º 1
0
        public bool TryAddUniform1(Vector3[] value, string uniformName, ShaderProg shader)
        {
            if (shader.GetUniform(uniformName) != -1)
            {
                float[] values = new float[value.Length * 3];
                for (int i = 0; i < value.Length; ++i)
                {
                    values[i * 3]     = value[i].X;
                    values[i * 3 + 1] = value[i].Y;
                    values[i * 3 + 2] = value[i].Z;
                }
                try
                {
                    GL.Uniform3(shader.GetUniform(uniformName), 3 * value.Length, values);
                }
                catch (Exception e)
                {
                    //Possible memmory error.
                    Console.WriteLine(e.Message);
                }

                return(true);
            }
            else
            {
                return(false);
            }
        }
Exemplo n.º 2
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.º 3
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.º 4
0
 public bool TryAddUniform1(int value, string uniformName, ShaderProg shader)
 {
     if (shader.GetUniform(uniformName) != -1)
     {
         GL.Uniform1(shader.GetUniform(uniformName), value);
         return(true);
     }
     else
     {
         return(false);
     }
 }
Exemplo n.º 5
0
        public Skybox(ShaderProg shader, string skyboxLocation = "Resources//Cubemaps") : base("CubemapSkybox")
        {
            SkyboxSceneObjectComponent skyboxComponent =
                new SkyboxSceneObjectComponent(skyboxLocation,
                                               shader,
                                               SkyboxSceneObjectComponent.SkyboxType.cubemap);
            MeshSceneObjectComponent meshComponent = new MeshSceneObjectComponent(
                new WavefrontModelLoader(),
                "Resources/box.obj1"
                );

            AddComponent(meshComponent);
            AddComponent(skyboxComponent);
        }
Exemplo n.º 6
0
 public bool TryAddUniformTexture2D(int textureID, string uniformName, ShaderProg shader, TextureUnit unit)
 {
     if (shader.GetUniform(uniformName) != -1)
     {
         GL.ActiveTexture(unit);
         GL.BindTexture(TextureTarget.Texture2D, textureID);
         GL.Uniform1(shader.GetUniform(uniformName), (int)unit - 33984);//convertation of enum to int texture layer
         return(true);
     }
     else
     {
         return(false);
     }
 }
Exemplo n.º 7
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);
        }
        public SkyboxSceneObjectComponent(string location, SkyboxType type)
        {
            _skyboxLocation = location;
            skyboxType      = type;
            switch (skyboxType)
            {
            case SkyboxType.cubemap:
            {
                _shader = new ShaderProg("vs_cubemap.glsl", "fs_cubemap.glsl", true);
                break;
            }

            case SkyboxType.hdr:
            {
                _shader = new ShaderProg("vs_hdr.glsl", "fs_hdr.glsl", true);
                break;
            }

            default: break;
            }
        }
Exemplo n.º 9
0
        public override void OnLoad()
        {
            ShaderProg skyboxShader =
                new ShaderProg("vs_cubemap.glsl", "fs_cubemap.glsl", true);

            _skybox = new Skybox(skyboxShader);
            base.OnLoad();
            //Lion gameObject = new Lion();
            //_sceneObjects.Add(gameObject);
            AnimatedModelTest animatedModel = new AnimatedModelTest();

            _sceneObjects.Add(animatedModel);
            PointLight light1 = new PointLight(new Vector3(0f, 0f, 0f), 1);

            light1.Position = new Vector3(0, 0, -1);
            _sceneObjects.Add(light1);

            GLtf2Helm gltf2helm = new GLtf2Helm();

            _sceneObjects.Add(gltf2helm);
        }
 public SkyboxSceneObjectComponent(string location, ShaderProg Shader, SkyboxType type)
 {
     _skyboxLocation = location;
     _shader         = Shader;
     skyboxType      = type;
 }