pull out Shader into its own file
This commit is contained in:
parent
6076abe9d1
commit
4514509c62
121
Program.cs
121
Program.cs
@ -192,124 +192,6 @@ public class CropTool : ITool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: switch to immediate mode??
|
|
||||||
// https://gamedev.stackexchange.com/questions/198805/opentk-immediate-mode-on-net-core-doesnt-work
|
|
||||||
// https://www.youtube.com/watch?v=Q23Kf9QEaO4
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: this should probably be IDisposable?
|
// FIXME: this should probably be IDisposable?
|
||||||
public class Photo {
|
public class Photo {
|
||||||
public string Filename;
|
public string Filename;
|
||||||
@ -1008,6 +890,9 @@ public class Game : GameWindow {
|
|||||||
photoIndex = Math.Max(0, photoIndex);
|
photoIndex = Math.Max(0, photoIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: switch to immediate mode??
|
||||||
|
// https://gamedev.stackexchange.com/questions/198805/opentk-immediate-mode-on-net-core-doesnt-work
|
||||||
|
// https://www.youtube.com/watch?v=Q23Kf9QEaO4
|
||||||
protected override void OnLoad() {
|
protected override void OnLoad() {
|
||||||
base.OnLoad();
|
base.OnLoad();
|
||||||
|
|
||||||
|
116
Shader.cs
Normal file
116
Shader.cs
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user