aboutsummaryrefslogtreecommitdiff
path: root/Unicity.Renderer/Shader.cs
diff options
context:
space:
mode:
authorAdrian Ulbrich <adrian.ulbrich.2003@gmail.com>2019-11-09 01:45:40 +0100
committerAdrian Ulbrich <adrian.ulbrich.2003@gmail.com>2019-11-09 01:45:40 +0100
commit6fd78657f010bcc48c746a7b1e6ae9a0589adf5b (patch)
tree479512c0858e3ddfbcd891a193dfc96530771087 /Unicity.Renderer/Shader.cs
parent3b214e75effaca1ba67daaf29d0a94e5b0129386 (diff)
downloadUnicity-6fd78657f010bcc48c746a7b1e6ae9a0589adf5b.tar.gz
Unicity-6fd78657f010bcc48c746a7b1e6ae9a0589adf5b.tar.bz2
Unicity-6fd78657f010bcc48c746a7b1e6ae9a0589adf5b.zip
Can render triangles now
Diffstat (limited to 'Unicity.Renderer/Shader.cs')
-rw-r--r--Unicity.Renderer/Shader.cs64
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;
+ }
}
}