Example #1
0
        public void Render(HDRSettings settings, RenderTarget input, RenderTarget output, RenderTarget bloom, RenderTarget lensFlares, RenderTarget luminance)
        {
            if (ShaderParams == null)
            {
                ShaderParams = new TonemapShaderParams();
                Shader.GetUniformLocations(ShaderParams);
            }

            Backend.BeginPass(output, new Vector4(0.0f, 0.0f, 0.0f, 1.0f));

            Textures[0] = input.Textures[0].Handle;
            Textures[1] = luminance.Textures[0].Handle;

            var activeTexture = 2;
            if (settings.EnableBloom)
                Textures[activeTexture++] = bloom.Textures[0].Handle;
            if (settings.EnableLensFlares)
                Textures[activeTexture++] = lensFlares.Textures[0].Handle;

            Backend.BeginInstance(Shader.Handle, Textures, samplers: Samplers);
            Backend.BindShaderVariable(ShaderParams.SamplerScene, 0);
            Backend.BindShaderVariable(ShaderParams.SamplerBloom, 2);
            Backend.BindShaderVariable(ShaderParams.SamplerLensFlares, 3);
            Backend.BindShaderVariable(ShaderParams.SamplerLuminance, 1);
            Backend.BindShaderVariable(ShaderParams.KeyValue, settings.KeyValue);
            Backend.BindShaderVariable(ShaderParams.EnableBloom, settings.EnableBloom ? 1 : 0);
            Backend.BindShaderVariable(ShaderParams.EnableLensFlares, settings.EnableLensFlares ? 1 : 0);

            Backend.DrawMesh(QuadMesh.MeshHandle);
            Backend.EndPass();
        }
Example #2
0
        public RenderTarget Render(HDRSettings settings, RenderTarget input, float deltaTime)
        {
            if (LuminanceMapParams == null)
            {
                LuminanceMapParams = new LuminanceMapShaderParams();
                AdaptLuminanceParams = new AdaptLuminanceShaderParams();

                LuminanceMapShader.GetUniformLocations(LuminanceMapShader);
                AdaptLuminanceShader.GetUniformLocations(AdaptLuminanceParams);
            }

            // Calculate luminance
            Backend.BeginPass(LuminanceTarget);
            Backend.BeginInstance(LuminanceMapShader.Handle, new int[] { input.Textures[0].Handle },
                samplers: new int[] { Backend.DefaultSamplerNoFiltering });
            Backend.BindShaderVariable(LuminanceMapParams.SamplerScene, 0);

            Backend.DrawMesh(QuadMesh.MeshHandle);
            Backend.EndPass();
            Backend.GenerateMips(LuminanceTarget.Textures[0].Handle);

            // Adapt luminace
            var adaptedLuminanceTarget = AdaptLuminanceTargets[CurrentLuminanceTarget];
            var adaptedLuminanceSource = AdaptLuminanceTargets[CurrentLuminanceTarget == 0 ? 1 : 0];
            CurrentLuminanceTarget = (CurrentLuminanceTarget + 1) % 2;

            Backend.BeginPass(adaptedLuminanceTarget);
            Backend.BeginInstance(AdaptLuminanceShader.Handle, new int[] { adaptedLuminanceSource.Textures[0].Handle, LuminanceTarget.Textures[0].Handle },
                samplers: new int[] { Backend.DefaultSamplerNoFiltering, Backend.DefaultSamplerMipMapNearest });
            Backend.BindShaderVariable(AdaptLuminanceParams.SamplerLastLuminacne, 0);
            Backend.BindShaderVariable(AdaptLuminanceParams.SamplerCurrentLuminance, 1);
            Backend.BindShaderVariable(AdaptLuminanceParams.TimeDelta, deltaTime);
            Backend.BindShaderVariable(AdaptLuminanceParams.Tau, settings.AdaptationRate);

            Backend.DrawMesh(QuadMesh.MeshHandle);
            Backend.EndPass();

            return adaptedLuminanceTarget;
        }
Example #3
0
        public RenderTarget Render(HDRSettings settings, RenderTarget input, RenderTarget luminance)
        {
            if (HighPassParams == null)
            {
                HighPassParams = new HighPassShaderParams();
                QuadParams = new QuadShaderParams();
                BlurHorizontalParams = new BlurShaderParams();
                BlurVerticalParams = new BlurShaderParams();

                HighPassShader.GetUniformLocations(HighPassParams);
                QuadShader.GetUniformLocations(QuadParams);
                BlurHorizontalShader.GetUniformLocations(BlurHorizontalParams);
                BlurVerticalShader.GetUniformLocations(BlurVerticalParams);
            }

            // High pass
            Backend.BeginPass(BlurTargets[0]);
            Backend.BeginInstance(HighPassShader.Handle, new int[] { input.Textures[0].Handle, luminance.Textures[0].Handle },
                samplers: new int[] { Backend.DefaultSamplerNoFiltering, Backend.DefaultSamplerNoFiltering });
            Backend.BindShaderVariable(HighPassParams.SamplerScene, 0);
            Backend.BindShaderVariable(HighPassParams.SamplerLuminance, 1);
            Backend.BindShaderVariable(HighPassParams.BloomThreshold, settings.BloomThreshold);
            Backend.BindShaderVariable(HighPassParams.KeyValue, settings.KeyValue);

            Backend.DrawMesh(QuadMesh.MeshHandle);
            Backend.EndPass();

            // Downsample 1
            Backend.BeginPass(BlurTargets[1]);
            Backend.BeginInstance(QuadShader.Handle, new int[] { BlurTargets[0].Textures[0].Handle },
                samplers: new int[] { BlurSampler });
            Backend.BindShaderVariable(QuadParams.SamplerScene, 0);

            Backend.DrawMesh(QuadMesh.MeshHandle);
            Backend.EndPass();

            // Downsample 2
            Backend.BeginPass(BlurTargets[2]);
            Backend.BeginInstance(QuadShader.Handle, new int[] { BlurTargets[1].Textures[0].Handle },
                samplers: new int[] { BlurSampler });
            Backend.BindShaderVariable(QuadParams.SamplerScene, 0);

            Backend.DrawMesh(QuadMesh.MeshHandle);
            Backend.EndPass();

            // Downsample 3
            Backend.BeginPass(BlurTargets[4]);
            Backend.BeginInstance(QuadShader.Handle, new int[] { BlurTargets[2].Textures[0].Handle },
                samplers: new int[] { BlurSampler });
            Backend.BindShaderVariable(QuadParams.SamplerScene, 0);

            Backend.DrawMesh(QuadMesh.MeshHandle);
            Backend.EndPass();

            // Blur
            for (var i = 0; i < 1; i++)
            {
                Vector2 blurTextureSize = new Vector2(BlurTargets[3].Width, BlurTargets[3].Height);

                // Blur horizontal
                Backend.BeginPass(BlurTargets[3]);
                Backend.BeginInstance(BlurHorizontalShader.Handle, new int[] { BlurTargets[4].Textures[0].Handle },
                    samplers: new int[] { Backend.DefaultSamplerNoFiltering });
                Backend.BindShaderVariable(BlurHorizontalParams.SamplerScene, 0);
                Backend.BindShaderVariable(BlurHorizontalParams.BlurSigma, settings.BlurSigma);
                Backend.BindShaderVariable(BlurHorizontalParams.TextureSize, ref blurTextureSize);

                Backend.DrawMesh(QuadMesh.MeshHandle);
                Backend.EndPass();

                // Blur vertical
                Backend.BeginPass(BlurTargets[4]);
                Backend.BeginInstance(BlurVerticalShader.Handle, new int[] { BlurTargets[3].Textures[0].Handle },
                    samplers: new int[] { Backend.DefaultSamplerNoFiltering });
                Backend.BindShaderVariable(BlurVerticalParams.SamplerScene, 0);
                Backend.BindShaderVariable(BlurVerticalParams.BlurSigma, settings.BlurSigma);
                Backend.BindShaderVariable(BlurVerticalParams.TextureSize, ref blurTextureSize);

                Backend.DrawMesh(QuadMesh.MeshHandle);
                Backend.EndPass();
            }

            return BlurTargets[4];
        }