diff options
Diffstat (limited to 'Unicity.Renderer/Shader.cs')
| -rw-r--r-- | Unicity.Renderer/Shader.cs | 64 |
1 files changed, 56 insertions, 8 deletions
diff --git a/Unicity.Renderer/Shader.cs b/Unicity.Renderer/Shader.cs index 6ee0b33..31dcef7 100644 --- a/Unicity.Renderer/Shader.cs +++ b/Unicity.Renderer/Shader.cs @@ -1,31 +1,79 @@ using System; +using OpenTK; using OpenTK.Graphics.OpenGL4; namespace Unicity.Renderer { class Shader { - //int program = 0; + int program = 0; public Shader(string vertexCode, string fragmentCode) { - int vertex = GL.CreateShader(ShaderType.VertexShader); + int vertexShader = GL.CreateShader(ShaderType.VertexShader); + int fragmentShader = GL.CreateShader(ShaderType.FragmentShader); - GL.ShaderSource(vertex, vertexCode); - GL.CompileShader(vertex); + GL.ShaderSource(vertexShader, vertexCode); + GL.ShaderSource(fragmentShader, fragmentCode); - if (!Compiled(vertex)) + GL.CompileShader(vertexShader); + GL.CompileShader(fragmentShader); + + if (!ShaderCompiled(vertexShader)) + { + GL.DeleteShader(vertexShader); + GL.DeleteBuffer(fragmentShader); + throw new Exception("Failed to compile vertex shader: " + GL.GetShaderInfoLog(vertexShader)); + } + + if (!ShaderCompiled(fragmentShader)) { - GL.DeleteShader(vertex); - throw new Exception("Failed to compile vertex shader: " + GL.GetShaderInfoLog(vertex)); + GL.DeleteShader(vertexShader); + GL.DeleteBuffer(fragmentShader); + throw new Exception("Failed to compile frgament shader: " + GL.GetShaderInfoLog(fragmentShader)); + } + + program = GL.CreateProgram(); + GL.AttachShader(program, vertexShader); + GL.AttachShader(program, fragmentShader); + + GL.LinkProgram(program); + + GL.DetachShader(program, vertexShader); + GL.DetachShader(program, fragmentShader); + GL.DeleteShader(vertexShader); + GL.DeleteShader(fragmentShader); + + if (!ProgramCompiled(program)) + { + GL.DeleteProgram(program); + throw new Exception("Failed to link shader program: " + GL.GetProgramInfoLog(program)); } } - private bool Compiled(int shader) + public void Use() + { + GL.UseProgram(program); + } + + public void SetUniform(string name, Vector4 value) + { + int location = GL.GetUniformLocation(program, name); + GL.Uniform4(location, value); + } + + private bool ShaderCompiled(int shader) { int[] output = new int[1]; GL.GetShader(shader, ShaderParameter.CompileStatus, output); return output[0] != 0; } + + private bool ProgramCompiled(int program) + { + int[] output = new int[1]; + GL.GetProgram(program, GetProgramParameterName.LinkStatus, output); + return output[0] != 0; + } } } |
