Added Shader class, default shaders
This commit is contained in:
8
assets/shaders/default.frag.glsl
Normal file
8
assets/shaders/default.frag.glsl
Normal file
@@ -0,0 +1,8 @@
|
||||
#version 330 core
|
||||
|
||||
in vec4 fColour;
|
||||
out vec4 colour;
|
||||
|
||||
void main() {
|
||||
colour = fColour;
|
||||
}
|
||||
11
assets/shaders/default.vert.glsl
Normal file
11
assets/shaders/default.vert.glsl
Normal file
@@ -0,0 +1,11 @@
|
||||
#version 330 core
|
||||
|
||||
layout (location = 0) in vec3 aPos;
|
||||
layout (location = 1) in vec4 aColour;
|
||||
|
||||
out vec4 fColour;
|
||||
|
||||
void main() {
|
||||
fColour = aColour;
|
||||
gl_Position = vec4(aPos, 1.0);
|
||||
}
|
||||
115
src/main/java/org/hirw/game/Shader.java
Normal file
115
src/main/java/org/hirw/game/Shader.java
Normal file
@@ -0,0 +1,115 @@
|
||||
package org.hirw.game;
|
||||
|
||||
import static org.lwjgl.opengl.GL20.*;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.InvalidPathException;
|
||||
import java.nio.file.NoSuchFileException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.EnumMap;
|
||||
import java.util.Map;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.hirw.game.util.Log;
|
||||
|
||||
public class Shader {
|
||||
private enum ShaderType {
|
||||
FRAG,
|
||||
VERT
|
||||
}
|
||||
|
||||
private static final EnumMap<ShaderType, Integer> SHADERS =
|
||||
new EnumMap<>(
|
||||
Map.of(
|
||||
ShaderType.FRAG, GL_FRAGMENT_SHADER,
|
||||
ShaderType.VERT, GL_VERTEX_SHADER));
|
||||
|
||||
private static final String DEFAULT_FRAG_PATH = "assets/shaders/default.frag.glsl";
|
||||
private static final String DEFAULT_VERT_PATH = "assets/shaders/default.vert.glsl";
|
||||
|
||||
@Getter private String vertexSource;
|
||||
@Getter private String fragmentSource;
|
||||
@Getter @Setter private int vertexID;
|
||||
@Getter @Setter private int fragmentID;
|
||||
@Getter @Setter private int shaderProgramID;
|
||||
|
||||
public Shader(String fragPath, String vertPath) {
|
||||
this.fragmentSource = readFromFile(fragPath);
|
||||
this.vertexSource = readFromFile(vertPath);
|
||||
}
|
||||
|
||||
public Shader() {
|
||||
this(DEFAULT_FRAG_PATH, DEFAULT_VERT_PATH);
|
||||
}
|
||||
|
||||
public void init() {
|
||||
compileShader(ShaderType.FRAG);
|
||||
compileShader(ShaderType.VERT);
|
||||
createProgram();
|
||||
}
|
||||
|
||||
private void compileShader(ShaderType shaderType) {
|
||||
int shaderID = glCreateShader(SHADERS.get(shaderType));
|
||||
|
||||
switch (shaderType) {
|
||||
case ShaderType.FRAG -> {
|
||||
setFragmentID(shaderID);
|
||||
glShaderSource(shaderID, getFragmentSource());
|
||||
}
|
||||
case ShaderType.VERT -> {
|
||||
setVertexID(shaderID);
|
||||
glShaderSource(shaderID, getVertexSource());
|
||||
}
|
||||
}
|
||||
|
||||
glCompileShader(shaderID);
|
||||
|
||||
if (glGetShaderi(shaderID, GL_COMPILE_STATUS) == GL_FALSE) {
|
||||
int len = glGetShaderi(shaderID, GL_INFO_LOG_LENGTH);
|
||||
Log.error(
|
||||
"Shader initialisation",
|
||||
String.format(
|
||||
"Failed to compile %s shader: %s",
|
||||
shaderType.toString(), glGetShaderInfoLog(shaderID, len)));
|
||||
}
|
||||
}
|
||||
|
||||
private void createProgram() {
|
||||
setShaderProgramID(glCreateProgram());
|
||||
glAttachShader(shaderProgramID, getVertexID());
|
||||
glAttachShader(shaderProgramID, getFragmentID());
|
||||
glLinkProgram(shaderProgramID);
|
||||
|
||||
int success = glGetProgrami(getShaderProgramID(), GL_LINK_STATUS);
|
||||
if (success == GL_FALSE) {
|
||||
int len = glGetProgrami(getShaderProgramID(), GL_INFO_LOG_LENGTH);
|
||||
|
||||
Log.error(
|
||||
"Shader initialisation",
|
||||
String.format(
|
||||
"Failed to create Shader Program: %s",
|
||||
glGetShaderInfoLog(getShaderProgramID(), len)));
|
||||
}
|
||||
}
|
||||
|
||||
private String readFromFile(String stringFilePath) {
|
||||
String source = "";
|
||||
|
||||
try {
|
||||
Path filePath = Paths.get(stringFilePath);
|
||||
source = Files.readString(filePath);
|
||||
|
||||
} catch (NoSuchFileException | InvalidPathException e) {
|
||||
Log.error(
|
||||
"Shader initialisation", "Couldn't open file (probably a bad path): " + stringFilePath);
|
||||
} catch (IOException e) {
|
||||
Log.error(
|
||||
"Shader initialisation",
|
||||
"An IO Exception occured while reading from file: " + stringFilePath);
|
||||
}
|
||||
|
||||
return source;
|
||||
}
|
||||
}
|
||||
@@ -80,6 +80,8 @@ public class Window {
|
||||
|
||||
GL.createCapabilities();
|
||||
glClearColor(0.0f, 0.0f, 2.0f, 0.0f);
|
||||
Shader someShader = new Shader();
|
||||
someShader.init();
|
||||
}
|
||||
|
||||
private void loop() {
|
||||
|
||||
Reference in New Issue
Block a user