using OpenTK.Graphics.OpenGL4; using System; using System.Collections.Generic; using System.Linq; using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; namespace Voxel { public class Shader { int handle; private bool disposedValue = false; public Shader(string vertexPath, string fragmentPath) { string vertexShaderSource = File.ReadAllText(vertexPath); string fragmentShaderSource = File.ReadAllText(fragmentPath); int vertexShader = GL.CreateShader(ShaderType.VertexShader); int fragmentShader = GL.CreateShader(ShaderType.FragmentShader); GL.ShaderSource(vertexShader, vertexShaderSource); GL.ShaderSource(fragmentShader, fragmentShaderSource); GL.CompileShader(vertexShader); GL.GetShader(vertexShader, ShaderParameter.CompileStatus, out int success); if (success == 0) { string infoLog = GL.GetShaderInfoLog(vertexShader); Console.WriteLine(infoLog); } GL.CompileShader(fragmentShader); if (success == 0) { string infoLog = GL.GetShaderInfoLog(fragmentShader); Console.WriteLine(infoLog); } // attach handle = GL.CreateProgram(); GL.AttachShader(handle, vertexShader); GL.AttachShader(handle, fragmentShader); GL.LinkProgram(handle); GL.GetProgram(handle, GetProgramParameterName.LinkStatus, out success); if (success == 0) { string infoLog = GL.GetProgramInfoLog(handle); Console.WriteLine(infoLog); } GL.DetachShader(handle, vertexShader); GL.DetachShader(handle, fragmentShader); GL.DeleteShader(fragmentShader); GL.DeleteShader(vertexShader); } public void Use() { GL.UseProgram(handle); } protected virtual void Dispose(bool disposing) { if (!disposedValue) { GL.DeleteProgram(handle); disposedValue = true; } } ~Shader() { if (disposedValue == false) { Console.WriteLine("GPU Resource leak! Did you forget to call Dispose()?"); } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } } }