#region usings using OpenTK.Graphics.OpenGL4; using SM.Base.PostProcess; using SM.Base.Utility; using SM.OGL.Framebuffer; #endregion namespace SM.Base.PostEffects { /// /// This class has some utility for render pipelines /// public static class PostProcessUtility { private static readonly PostProcessShader _hdrExposureShader = new PostProcessShader(AssemblyUtility.ReadAssemblyFile(SMRenderer.PostProcessPath + ".finalize_hdr.glsl")); private static readonly PostProcessShader _gammaShader = new PostProcessShader( AssemblyUtility.ReadAssemblyFile(SMRenderer.PostProcessPath + ".finalize_gamma.glsl")); /// /// The gamma that is used for and . /// public static float Gamma = 2.2f; /// /// This resolves a multisampled framebuffer to a non-multisampled renderbuffer. /// This removes the depth buffer. /// /// /// public static void ResolveMultisampledBuffers(Framebuffer multisampledBuffers, Framebuffer target) { multisampledBuffers.Activate(FramebufferTarget.ReadFramebuffer); target.Activate(FramebufferTarget.DrawFramebuffer); GL.BlitFramebuffer(0, 0, (int) multisampledBuffers.Size.X, (int) multisampledBuffers.Size.Y, 0, 0, (int) target.Size.X, (int) target.Size.Y, ClearBufferMask.ColorBufferBit, BlitFramebufferFilter.Nearest); target.Activate(); } /// /// This converts HDR to LDR and applys gamma. /// /// /// public static void FinalizeHDR(ColorAttachment attachment, float exposure) { _hdrExposureShader.Draw(u => { u["Gamma"].SetUniform1(Gamma); u["Exposure"].SetUniform1(exposure); u["Scene"].SetTexture(attachment); }); } /// /// This applys gamma /// /// public static void FinalizeGamma(ColorAttachment attachment) { _gammaShader.Draw(u => { u["Gamma"].SetUniform1(Gamma); u["Scene"].SetTexture(attachment); }); } } }