Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat: adding shaders
  • Loading branch information
JeremyMeissner committed Apr 6, 2022
commit 7e45e49367e618f046bae4e6c3eb96e21271d38b
4 changes: 4 additions & 0 deletions FreeFrame/FreeFrame.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,8 @@
<PackageReference Include="OpenTK" Version="4.7.1" />
</ItemGroup>

<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="if not exist $(ProjectDir)$(OutDir)Shaders mkdir $(ProjectDir)$(OutDir)Shaders&#xD;&#xA;copy &quot;$(ProjectDir)Shaders\*&quot; &quot;$(ProjectDir)$(OutDir)Shaders\&quot;" />
</Target>

</Project>
8 changes: 8 additions & 0 deletions FreeFrame/Shaders/shader.frag
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#version 330

layout(location = 0) out vec4 color;

void main()
{
color = vec4(0.5, 0.5, 0.5, 1.0);
}
8 changes: 8 additions & 0 deletions FreeFrame/Shaders/shader.vert
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#version 330 core

layout(location = 0) in vec4 position;

void main()
{
gl_Position = position;
}
75 changes: 71 additions & 4 deletions FreeFrame/Window.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,24 +13,75 @@ class Window : GameWindow
{
int _vertexBuffer;

int _vertexArray;

int _shader;

public readonly float[] _vertices =
{
0.0f, -0.5f, 0.0f, // Top
-0.5f, 0.5f, 0.0f, // Bottom-Left
0.5f, 0.5f, 0.0f // Bottom-Right
0.0f, 0.5f, 0.0f, // Top
-0.5f, -0.5f, 0.0f, // Bottom-Left
0.5f, -0.5f, 0.0f // Bottom-Right
};
public Window(GameWindowSettings gameWindowSettings, NativeWindowSettings nativeWindowSettings) : base(gameWindowSettings, nativeWindowSettings) { }

static int CompileShader(string uri, ShaderType type)
{
int shader = GL.CreateShader(type);

GL.ShaderSource(shader, File.ReadAllText(uri)); // Import the source code of the shader
GL.CompileShader(shader);

GL.GetShader(shader, ShaderParameter.CompileStatus, out int compileStatus); // compileStatus is 0 if compile error
if (compileStatus == 0)
{
Console.WriteLine("{0}: {1}", type.ToString(), GL.GetShaderInfoLog(shader));
throw new Exception(); // TODO: Remove this exception
}

return shader;
}

static int CreateShader(string uriVertexShader, string uriFragementShader)
{
int program = GL.CreateProgram();

int vertexShader = CompileShader(uriVertexShader, ShaderType.VertexShader);
int fragmentShader = CompileShader(uriFragementShader, ShaderType.FragmentShader);

// TODO: Handling error

GL.AttachShader(program, vertexShader);
GL.AttachShader(program, fragmentShader);

GL.LinkProgram(program); // Put the shaders in their respective processor
GL.ValidateProgram(program); // Check if everything correct and store the information on the logs
// TODO: Explain what's the difference with GL.ShaderInfoLog

GL.DeleteShader(vertexShader);
GL.DeleteShader(fragmentShader);

return program;
}
protected override void OnLoad()
{
base.OnLoad();

GL.ClearColor(0.1f, 0.1f, 0.1f, 1.0f);

_vertexBuffer = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ArrayBuffer, _vertexBuffer);

GL.BufferData(BufferTarget.ArrayBuffer, _vertices.Length * sizeof(float), _vertices, BufferUsageHint.StaticDraw);

_vertexArray = GL.GenVertexArray(); // TODO: Why a vertex array is necessary ?
GL.BindVertexArray(_vertexArray);

GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0);
GL.EnableVertexAttribArray(0);

_shader = CreateShader("Shaders/shader.vert", "Shaders/shader.frag");

GL.UseProgram(_shader);
}
protected override void OnResize(ResizeEventArgs e)
{
Expand All @@ -52,12 +103,28 @@ protected override void OnUpdateFrame(FrameEventArgs e)
protected override void OnRenderFrame(FrameEventArgs e)
{
base.OnRenderFrame(e);

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

GL.UseProgram(_shader);
GL.BindVertexArray(_vertexArray);

GL.DrawArrays(PrimitiveType.Triangles, 0, 3);

SwapBuffers();
}

protected override void OnUnload()
{
base.OnUnload();

GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindVertexArray(_vertexArray);
GL.UseProgram(0);

GL.DeleteProgram(_shader);
GL.DeleteBuffer(_vertexBuffer);
GL.DeleteVertexArray(_vertexArray);
}
}
}