aboutsummaryrefslogtreecommitdiff
path: root/Unicity.Renderer/Shader.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Unicity.Renderer/Shader.cs')
-rw-r--r--Unicity.Renderer/Shader.cs92
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;
}
}
}