Skip to content

Commit c9cf3d1

Browse files
refactor: add Shader class
1 parent 51c4453 commit c9cf3d1

3 files changed

Lines changed: 59 additions & 44 deletions

File tree

FreeFrame.sln

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
33
# Visual Studio Version 17
44
VisualStudioVersion = 17.1.32228.430
55
MinimumVisualStudioVersion = 10.0.40219.1
6-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeFrame", "FreeFrame\FreeFrame.csproj", "{0B6F5913-5F9E-43E6-9C2B-6458771C0B64}"
6+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeFrame", "FreeFrame\FreeFrame.csproj", "{0B6F5913-5F9E-43E6-9C2B-6458771C0B64}"
7+
EndProject
8+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{7624DAC1-357B-4264-8501-F60942B4AD85}"
79
EndProject
810
Global
911
GlobalSection(SolutionConfigurationPlatforms) = preSolution

FreeFrame/Shader.cs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using OpenTK.Graphics.OpenGL4;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
8+
namespace FreeFrame
9+
{
10+
class Shader
11+
{
12+
private int _program;
13+
int CompileShader(string uri, ShaderType type)
14+
{
15+
int shader = GL.CreateShader(type);
16+
17+
GL.ShaderSource(shader, File.ReadAllText(uri)); // Import the source code of the shader
18+
GL.CompileShader(shader);
19+
20+
GL.GetShader(shader, ShaderParameter.CompileStatus, out int compileStatus); // compileStatus is 0 if compile error
21+
if (compileStatus == 0)
22+
{
23+
Console.WriteLine("{0}: {1}", type.ToString(), GL.GetShaderInfoLog(shader));
24+
throw new Exception(); // TODO: Remove this exception
25+
}
26+
27+
return shader;
28+
}
29+
public Shader(string uriVertexShader, string uriFragementShader)
30+
{
31+
_program = GL.CreateProgram();
32+
33+
int vertexShader = CompileShader(uriVertexShader, ShaderType.VertexShader);
34+
int fragmentShader = CompileShader(uriFragementShader, ShaderType.FragmentShader);
35+
36+
// TODO: Handling error
37+
38+
GL.AttachShader(_program, vertexShader);
39+
GL.AttachShader(_program, fragmentShader);
40+
41+
GL.LinkProgram(_program); // Put the shaders in their respective processor
42+
GL.ValidateProgram(_program); // Check if everything correct and store the information on the logs
43+
// TODO: Explain what's the difference with GL.ShaderInfoLog
44+
45+
GL.DeleteShader(vertexShader);
46+
GL.DeleteShader(fragmentShader);
47+
}
48+
public void Use() => GL.UseProgram(_program);
49+
~Shader() => GL.DeleteProgram(_program);
50+
}
51+
}

FreeFrame/Window.cs

Lines changed: 5 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Linq;
77
using System.Text;
88
using System.Threading.Tasks;
9+
using FreeFrame.Shaders;
910

1011
namespace FreeFrame
1112
{
@@ -14,7 +15,7 @@ class Window : GameWindow
1415
int _vertexBuffer;
1516
int _vertexArray;
1617
int _indexBuffer;
17-
int _shader;
18+
Shader _shader;
1819

1920
public readonly float[] _vertices =
2021
{
@@ -31,45 +32,7 @@ class Window : GameWindow
3132
};
3233

3334
public Window(GameWindowSettings gameWindowSettings, NativeWindowSettings nativeWindowSettings) : base(gameWindowSettings, nativeWindowSettings) { }
34-
35-
static int CompileShader(string uri, ShaderType type)
36-
{
37-
int shader = GL.CreateShader(type);
38-
39-
GL.ShaderSource(shader, File.ReadAllText(uri)); // Import the source code of the shader
40-
GL.CompileShader(shader);
41-
42-
GL.GetShader(shader, ShaderParameter.CompileStatus, out int compileStatus); // compileStatus is 0 if compile error
43-
if (compileStatus == 0)
44-
{
45-
Console.WriteLine("{0}: {1}", type.ToString(), GL.GetShaderInfoLog(shader));
46-
throw new Exception(); // TODO: Remove this exception
47-
}
48-
49-
return shader;
50-
}
51-
52-
static int CreateShader(string uriVertexShader, string uriFragementShader)
53-
{
54-
int program = GL.CreateProgram();
55-
56-
int vertexShader = CompileShader(uriVertexShader, ShaderType.VertexShader);
57-
int fragmentShader = CompileShader(uriFragementShader, ShaderType.FragmentShader);
58-
59-
// TODO: Handling error
60-
61-
GL.AttachShader(program, vertexShader);
62-
GL.AttachShader(program, fragmentShader);
6335

64-
GL.LinkProgram(program); // Put the shaders in their respective processor
65-
GL.ValidateProgram(program); // Check if everything correct and store the information on the logs
66-
// TODO: Explain what's the difference with GL.ShaderInfoLog
67-
68-
GL.DeleteShader(vertexShader);
69-
GL.DeleteShader(fragmentShader);
70-
71-
return program;
72-
}
7336
protected override void OnLoad()
7437
{
7538
base.OnLoad();
@@ -94,8 +57,8 @@ protected override void OnLoad()
9457
GL.BufferData(BufferTarget.ElementArrayBuffer, _indices.Length * sizeof(uint), _indices, BufferUsageHint.StaticDraw);
9558

9659
// Shaders
97-
_shader = CreateShader("Shaders/shader.vert", "Shaders/shader.frag");
98-
GL.UseProgram(_shader);
60+
_shader = new Shader("Shaders/shader.vert", "Shaders/shader.frag");
61+
_shader.Use();
9962
}
10063
protected override void OnResize(ResizeEventArgs e)
10164
{
@@ -120,7 +83,7 @@ protected override void OnRenderFrame(FrameEventArgs e)
12083

12184
GL.Clear(ClearBufferMask.ColorBufferBit); // Clear the color
12285

123-
//GL.UseProgram(_shader);
86+
//_shader.Use();
12487
//GL.BindVertexArray(_vertexArray);
12588

12689
GL.DrawElements(PrimitiveType.Triangles, _indices.Length, DrawElementsType.UnsignedInt, 0);
@@ -137,7 +100,6 @@ protected override void OnUnload()
137100
GL.BindVertexArray(0);
138101
GL.UseProgram(0);
139102

140-
GL.DeleteProgram(_shader);
141103
GL.DeleteBuffer(_vertexBuffer);
142104
GL.DeleteBuffer(_indexBuffer);
143105
GL.DeleteVertexArray(_vertexArray);

0 commit comments

Comments
 (0)