From 7c1f3508c49706e394b71b3de92513078f67b7be Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Sat, 18 Apr 2020 00:42:13 +0200 Subject: [PATCH] [DEV] tutorial 5 implementation --- src/engineTester/MainGameLoop.java | 7 ++- src/shaders/ShaderProgram.java | 72 ++++++++++++++++++++++++++++++ src/shaders/StaticShader.java | 16 +++++++ src/shaders/fragmentShader.txt | 10 +++++ src/shaders/vertexShader.txt | 12 +++++ 5 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 src/shaders/ShaderProgram.java create mode 100644 src/shaders/StaticShader.java create mode 100644 src/shaders/fragmentShader.txt create mode 100644 src/shaders/vertexShader.txt diff --git a/src/engineTester/MainGameLoop.java b/src/engineTester/MainGameLoop.java index 0b01f5f..ccc34b2 100644 --- a/src/engineTester/MainGameLoop.java +++ b/src/engineTester/MainGameLoop.java @@ -6,6 +6,7 @@ import renderEngine.DisplayManagerDraw; import renderEngine.Loader; import renderEngine.RawModel; import renderEngine.Renderer; +import shaders.StaticShader; /** * This class contains the main method and is used to test the engine. @@ -27,8 +28,8 @@ public class MainGameLoop { DisplayManager manager = new DisplayManager(); Loader loader = new Loader(); Renderer renderer = new Renderer(); - manager.init(); + StaticShader shader = new StaticShader(); float[] vertices = { -0.5f, 0.5f, 0f,//v0 @@ -48,11 +49,13 @@ public class MainGameLoop { @Override public void draw() { renderer.prepare(); + shader.start(); renderer.render(model); + shader.stop(); } }); manager.loop(); - + shader.cleanUp(); loader.cleanUp(); manager.unInit(); } diff --git a/src/shaders/ShaderProgram.java b/src/shaders/ShaderProgram.java new file mode 100644 index 0000000..b50aeb1 --- /dev/null +++ b/src/shaders/ShaderProgram.java @@ -0,0 +1,72 @@ +package shaders; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL20; + +public abstract class ShaderProgram { + + private int programID; + private int vertexShaderID; + private int fragmentShaderID; + + public ShaderProgram (String vertexFile, String fragmentFile) { + vertexShaderID = loadShader(vertexFile, GL20.GL_VERTEX_SHADER); + fragmentShaderID = loadShader(fragmentFile, GL20.GL_FRAGMENT_SHADER); + programID = GL20.glCreateProgram(); + GL20.glAttachShader(programID, vertexShaderID); + GL20.glAttachShader(programID, fragmentShaderID); + GL20.glLinkProgram(programID); + GL20.glValidateProgram(programID); + bindAttributes(); + } + + public void start() { + GL20.glUseProgram(programID); + } + public void stop() { + GL20.glUseProgram(0); + } + public void cleanUp() { + stop(); + GL20.glDetachShader(programID, vertexShaderID); + GL20.glDetachShader(programID, fragmentShaderID); + GL20.glDeleteShader(vertexShaderID); + GL20.glDeleteShader(fragmentShaderID); + GL20.glDeleteProgram(programID); + } + + protected abstract void bindAttributes(); + + protected void bindAttribute(int attribute, String variableName) { + GL20.glBindAttribLocation(programID, attribute, variableName); + } + + private static int loadShader(String file, int type) { + StringBuilder shaderSource = new StringBuilder(); + try { + BufferedReader reader = new BufferedReader(new FileReader(file)); + String line; + while((line = reader.readLine()) != null) { + shaderSource.append(line).append("\n"); + } + reader.close(); + } catch(IOException e) { + System.err.println("Could not read the file!"); + e.printStackTrace(); + System.exit(-1); + } + int shaderID = GL20.glCreateShader(type); + GL20.glShaderSource(shaderID, shaderSource); + GL20.glCompileShader(shaderID); + if (GL20.glGetShaderi(shaderID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) { + System.out.println(GL20.glGetShaderInfoLog(shaderID, 500)); + System.out.println("Could not compile the shader"); + System.exit(-1); + } + return shaderID; + } +} diff --git a/src/shaders/StaticShader.java b/src/shaders/StaticShader.java new file mode 100644 index 0000000..f6ab20c --- /dev/null +++ b/src/shaders/StaticShader.java @@ -0,0 +1,16 @@ +package shaders; + +public class StaticShader extends ShaderProgram { + private static final String VERTEX_FILE = "src/shaders/vertexShader.txt"; + private static final String FRAGMENT_FILE = "src/shaders/fragmentShader.txt"; + + public StaticShader() { + super(VERTEX_FILE, FRAGMENT_FILE); + } + + @Override + protected void bindAttributes() { + super.bindAttribute(0, "position"); + } + +} diff --git a/src/shaders/fragmentShader.txt b/src/shaders/fragmentShader.txt new file mode 100644 index 0000000..3920269 --- /dev/null +++ b/src/shaders/fragmentShader.txt @@ -0,0 +1,10 @@ +#version 400 core + +in vec3 colour; + +out vec4 out_Color; + +void main(void) { + out_Color = vec4(colour, 1.0); +} + diff --git a/src/shaders/vertexShader.txt b/src/shaders/vertexShader.txt new file mode 100644 index 0000000..8399bc2 --- /dev/null +++ b/src/shaders/vertexShader.txt @@ -0,0 +1,12 @@ +#version 400 core + +in vec3 position; + +out vec3 colour; + +void main(void) { + + gl_Position = vec4(position, 1.0); + colour = vec3(position.x+0.5, 1.0, position.y+0.5); +} +