Updater/Updater/Shader.cs
2023-10-16 22:46:48 -04:00

83 lines
2.1 KiB
C#
Executable File

using OpenTK.Graphics.OpenGL4;
namespace Updater
{
public class Shader : IDisposable
{
public int Handle { get; }
private readonly int VertexShader;
private readonly int FragmentShader;
private bool disposedValue = false;
public Shader(string VertexShaderSource, string FragmentShaderSource)
{
VertexShader = GL.CreateShader(ShaderType.VertexShader);
GL.ShaderSource(VertexShader, VertexShaderSource);
FragmentShader = GL.CreateShader(ShaderType.FragmentShader);
GL.ShaderSource(FragmentShader, FragmentShaderSource);
GL.CompileShader(VertexShader);
string infoLogVert = GL.GetShaderInfoLog(VertexShader);
if (infoLogVert != string.Empty)
Console.WriteLine(infoLogVert);
GL.CompileShader(FragmentShader);
string infoLogFrag = GL.GetShaderInfoLog(FragmentShader);
if (infoLogFrag != string.Empty)
Console.WriteLine(infoLogFrag);
Handle = GL.CreateProgram();
GL.AttachShader(Handle, VertexShader);
GL.AttachShader(Handle, FragmentShader);
GL.LinkProgram(Handle);
GL.DetachShader(Handle, VertexShader);
GL.DetachShader(Handle, FragmentShader);
GL.DeleteShader(FragmentShader);
GL.DeleteShader(VertexShader);
}
public void Use()
{
GL.UseProgram(Handle);
}
public int GetAttribLocation(string attribName)
{
return GL.GetAttribLocation(Handle, attribName);
}
public Shader Clone()
{
return (Shader)MemberwiseClone();
}
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
GL.DeleteProgram(Handle);
disposedValue = true;
}
}
~Shader()
{
GL.DeleteProgram(Handle);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}