#region usings using OpenTK.Graphics.OpenGL4; using SM.OGL.Mesh; #endregion namespace SM.OGL.Shaders { /// /// Abstract class, that is used to create graphic shader. /// public abstract class GenericShader : GLObject { protected override bool AutoCompile { get; } = true; /// /// Contains the different files for the shader. /// protected ShaderFileCollection ShaderFileFiles; /// /// Contains and manage the uniforms from the shader. /// protected UniformCollection Uniforms; protected GenericShader(string vertex, string fragment) : this(new ShaderFileCollection(vertex, fragment)){} /// protected GenericShader(ShaderFileCollection shaderFileFiles) { ShaderFileFiles = shaderFileFiles; } /// public override ObjectLabelIdentifier TypeIdentifier { get; } = ObjectLabelIdentifier.Program; /// /// Loads the shader to the GPU. /// public void Load() { _id = GL.CreateProgram(); ShaderFileFiles.Append(this); GL.LinkProgram(_id); Name(GetType().Name); ShaderFileFiles.Detach(this); Uniforms = new UniformCollection(); Uniforms.ParentShader = this; Uniforms.Import(this); GLDebugging.CheckGLErrors($"A error occured at shader creation for '{GetType()}': %code%"); } /// public override void Compile() { Load(); } /// /// Draws the mesh. /// /// The mesh. /// The amounts for instancing. /// Binds the vertex array for the mesh. protected void DrawObject(GenericMesh mesh, int amount = 1) { if (mesh.Indices != null) GL.DrawElementsInstanced(mesh.PrimitiveType, 0, DrawElementsType.UnsignedInt, mesh.Indices, amount); else GL.DrawArraysInstanced(mesh.PrimitiveType, 0, mesh.Vertex.Count, amount); } /// /// Resets the shader specific settings to ensure proper workings. /// protected void CleanUp() { Uniforms.NextTexture = 0; GL.BindTexture(TextureTarget.Texture2D, 0); GL.BindVertexArray(0); } } }