using System; using System.Collections.Generic; using OpenTK.Graphics.OpenGL4; using SM.Base.Objects.Static; using SM.OGL.Framebuffer; using SM.OGL.Shaders; using SM.Utility; namespace SM.Base.PostProcess { /// /// Specific shader for post processing. /// public class PostProcessShader : GenericShader { private static readonly ShaderFile _fragExtensions = new ShaderFile(AssemblyUtility.ReadAssemblyFile("SM.Base.PostProcess.DefaultFiles.extensions.frag")); private static readonly ShaderFile _normalVertex = new ShaderFile(AssemblyUtility.ReadAssemblyFile("SM.Base.PostProcess.DefaultFiles.vertexFile.vert")); private static readonly string _normalVertexWithExt = AssemblyUtility.ReadAssemblyFile("SM.Base.PostProcess.DefaultFiles.vertexWithExt.vert"); /// /// Creates the shader with the default vertex shader and custom fragment. /// public PostProcessShader(string fragment) : this(_normalVertex, new ShaderFile(fragment)) { } /// /// Creates the shader with an vertex extension and custom fragment. /// /// /// public PostProcessShader(string vertexExt, string fragment) : this(new ShaderFile(_normalVertexWithExt) { GLSLExtensions = new List() { new ShaderFile(vertexExt) } }, new ShaderFile(fragment)) { } private PostProcessShader(ShaderFile vertex, ShaderFile fragment) : base( new ShaderFileCollection(vertex, fragment)) { fragment.GLSLExtensions.Add(_fragExtensions); } /// /// Draws the shader without special uniforms. /// /// public void Draw(ColorAttachment color) { GL.UseProgram(this); GL.BindVertexArray(Plate.Object); Uniforms["MVP"].SetMatrix4(PostProcessEffect.Mvp); Uniforms["ModelMatrix"].SetMatrix4(PostProcessEffect.Model); Uniforms["renderedTexture"].SetTexture(color); GL.DrawArrays(PrimitiveType.Quads, 0, 4); CleanUp(); GL.UseProgram(0); } /// /// Draws the shader with special uniforms. /// /// /// public void Draw(ColorAttachment color, Action setUniformAction) { GL.UseProgram(this); GL.BindVertexArray(Plate.Object); Uniforms["MVP"].SetMatrix4(PostProcessEffect.Mvp); Uniforms["ModelMatrix"].SetMatrix4(PostProcessEffect.Model); Uniforms["renderedTexture"].SetTexture(color); setUniformAction(Uniforms); GL.DrawArrays(PrimitiveType.Quads, 0, 4); CleanUp(); GL.UseProgram(0); } } }