diff options
Diffstat (limited to 'Unicity.Renderer/Shader.cs')
| -rw-r--r-- | Unicity.Renderer/Shader.cs | 92 |
1 files changed, 14 insertions, 78 deletions
diff --git a/Unicity.Renderer/Shader.cs b/Unicity.Renderer/Shader.cs index 76393a0..6ee0b33 100644 --- a/Unicity.Renderer/Shader.cs +++ b/Unicity.Renderer/Shader.cs @@ -1,95 +1,31 @@ -using OpenTK; +using System; using OpenTK.Graphics.OpenGL4; namespace Unicity.Renderer { - public class Shader + class Shader { - int id = 0; + //int program = 0; - public Shader(string vertexShaderSource, string fragmentShaderSource) + public Shader(string vertexCode, string fragmentCode) { - int vertexShader = GL.CreateShader(ShaderType.VertexShader); - GL.ShaderSource(vertexShader, vertexShaderSource); - GL.CompileShader(vertexShader); + int vertex = GL.CreateShader(ShaderType.VertexShader); - int[] isCompiled = new int[1]; - GL.GetShader(vertexShader, ShaderParameter.CompileStatus, isCompiled); - if (isCompiled[0] == 0) - { - string infoLog = GL.GetShaderInfoLog(vertexShader); - GL.DeleteShader(vertexShader); - throw new ShaderCompilationFailedException("Failed to compile vertex shader:\n" + infoLog); - } + GL.ShaderSource(vertex, vertexCode); + GL.CompileShader(vertex); - int fragmentShader = GL.CreateShader(ShaderType.FragmentShader); - GL.ShaderSource(fragmentShader, fragmentShaderSource); - GL.CompileShader(fragmentShader); - - GL.GetShader(fragmentShader, ShaderParameter.CompileStatus, isCompiled); - if (isCompiled[0] == 0) + if (!Compiled(vertex)) { - string infoLog = GL.GetShaderInfoLog(fragmentShader); - GL.DeleteShader(fragmentShader); - GL.DeleteShader(vertexShader); - throw new ShaderCompilationFailedException("Failed to compile fragment shader:\n" + infoLog); + GL.DeleteShader(vertex); + throw new Exception("Failed to compile vertex shader: " + GL.GetShaderInfoLog(vertex)); } - - int program = GL.CreateProgram(); - - GL.AttachShader(program, vertexShader); - GL.AttachShader(program, fragmentShader); - - GL.LinkProgram(program); - - int[] isLinked = new int[1]; - GL.GetProgram(program, GetProgramParameterName.LinkStatus, isLinked); - if (isLinked[0] == 0) - { - string infoLog = GL.GetProgramInfoLog(program); - GL.DeleteProgram(program); - GL.DeleteShader(fragmentShader); - GL.DeleteShader(vertexShader); - throw new ShaderCompilationFailedException("Failed to link shader program"); - } - - GL.DetachShader(program, vertexShader); - GL.DetachShader(program, fragmentShader); - GL.DeleteShader(vertexShader); - GL.DeleteShader(fragmentShader); - - id = program; - } - - public void Use() - { - GL.UseProgram(id); - } - - public void SetUniform(string name, Matrix4 value) - { - int uniformLocation = GL.GetUniformLocation(id, name); - - GL.UniformMatrix4(uniformLocation, false, ref value); - } - - public void SetUniform(string name, Vector3 value) - { - int uniformLocation = GL.GetUniformLocation(id, name); - - GL.Uniform3(uniformLocation, ref value); - } - - public void SetUniform(string name, float value) - { - int uniformLocation = GL.GetUniformLocation(id, name); - - GL.Uniform1(uniformLocation, value); } - public void Delete() + private bool Compiled(int shader) { - GL.DeleteProgram(id); + int[] output = new int[1]; + GL.GetShader(shader, ShaderParameter.CompileStatus, output); + return output[0] != 0; } } } |
