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(); }
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; }
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]; }