Colin McMillen
11 months ago
2 changed files with 119 additions and 118 deletions
-
121Program.cs
-
116Shader.cs
@ -0,0 +1,116 @@ |
|||||
|
using OpenTK.Graphics.OpenGL4; |
||||
|
|
||||
|
public class Shader : IDisposable { |
||||
|
public int Handle; |
||||
|
private bool init = false; |
||||
|
|
||||
|
public Shader() {} |
||||
|
|
||||
|
public void Init() { |
||||
|
init = true; |
||||
|
int VertexShader; |
||||
|
int FragmentShader; |
||||
|
|
||||
|
string VertexShaderSource = @"
|
||||
|
#version 330 |
||||
|
|
||||
|
layout(location = 0) in vec3 aPosition; |
||||
|
layout(location = 1) in vec2 aTexCoord; |
||||
|
|
||||
|
out vec2 texCoord; |
||||
|
|
||||
|
uniform mat4 projection; |
||||
|
|
||||
|
void main(void) { |
||||
|
texCoord = aTexCoord; |
||||
|
gl_Position = vec4(aPosition, 1.0) * projection; |
||||
|
}";
|
||||
|
|
||||
|
string FragmentShaderSource = @"
|
||||
|
#version 330 |
||||
|
|
||||
|
out vec4 outputColor; |
||||
|
in vec2 texCoord; |
||||
|
uniform sampler2D texture0; |
||||
|
uniform vec4 color; |
||||
|
|
||||
|
void main() { |
||||
|
outputColor = texture(texture0, texCoord) * color; |
||||
|
}";
|
||||
|
|
||||
|
VertexShader = GL.CreateShader(ShaderType.VertexShader); |
||||
|
GL.ShaderSource(VertexShader, VertexShaderSource); |
||||
|
|
||||
|
FragmentShader = GL.CreateShader(ShaderType.FragmentShader); |
||||
|
GL.ShaderSource(FragmentShader, FragmentShaderSource); |
||||
|
|
||||
|
GL.CompileShader(VertexShader); |
||||
|
|
||||
|
int success; |
||||
|
GL.GetShader(VertexShader, ShaderParameter.CompileStatus, out success); |
||||
|
if (success == 0) { |
||||
|
string infoLog = GL.GetShaderInfoLog(VertexShader); |
||||
|
Console.WriteLine(infoLog); |
||||
|
} |
||||
|
|
||||
|
GL.CompileShader(FragmentShader); |
||||
|
|
||||
|
GL.GetShader(FragmentShader, ShaderParameter.CompileStatus, out success); |
||||
|
if (success == 0) { |
||||
|
string infoLog = GL.GetShaderInfoLog(FragmentShader); |
||||
|
Console.WriteLine(infoLog); |
||||
|
} |
||||
|
Handle = GL.CreateProgram(); |
||||
|
|
||||
|
GL.AttachShader(Handle, VertexShader); |
||||
|
GL.AttachShader(Handle, FragmentShader); |
||||
|
|
||||
|
GL.LinkProgram(Handle); |
||||
|
|
||||
|
GL.GetProgram(Handle, GetProgramParameterName.LinkStatus, out success); |
||||
|
if (success == 0) { |
||||
|
string infoLog = GL.GetProgramInfoLog(Handle); |
||||
|
Console.WriteLine(infoLog); |
||||
|
} |
||||
|
|
||||
|
GL.DetachShader(Handle, VertexShader); |
||||
|
GL.DetachShader(Handle, FragmentShader); |
||||
|
GL.DeleteShader(FragmentShader); |
||||
|
GL.DeleteShader(VertexShader); |
||||
|
} |
||||
|
|
||||
|
public void Use() { |
||||
|
if (!init) { |
||||
|
Console.WriteLine("Shader.Use(): must call Init() first"); |
||||
|
} |
||||
|
GL.UseProgram(Handle); |
||||
|
} |
||||
|
|
||||
|
private bool disposedValue = false; |
||||
|
|
||||
|
protected virtual void Dispose(bool disposing) { |
||||
|
if (!disposedValue) { |
||||
|
GL.DeleteProgram(Handle); |
||||
|
disposedValue = true; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
~Shader() { |
||||
|
if (disposedValue == false) { |
||||
|
Console.WriteLine("~Shader(): resource leak? Dispose() should be called manually."); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public void Dispose() { |
||||
|
Dispose(true); |
||||
|
GC.SuppressFinalize(this); |
||||
|
} |
||||
|
|
||||
|
public int GetAttribLocation(string name) { |
||||
|
return GL.GetAttribLocation(Handle, name); |
||||
|
} |
||||
|
|
||||
|
public int GetUniformLocation(string name) { |
||||
|
return GL.GetUniformLocation(Handle, name); |
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue