1
0
Fork 0
This repository has been archived on 2024-01-06. You can view files and clone it, but cannot push or open issues or pull requests.
Modern-Game-Engine/src/mrdev023/rendering/Shader.java
Florian Richer (MrDev023) 145438d5f4 Update
2015-12-24 13:15:02 +01:00

120 lines
3.4 KiB
Java

package mrdev023.rendering;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL20.*;
import java.io.*;
import mrdev023.math.*;
import mrdev023.utils.*;
public class Shader {
public int program;
public int includeV = 0,includeF = 0;
public static Shader MAIN,LIGHT,LIGHT_AMBIENT,FONT;
public static void init() {
System.out.println("---------------------------- Load Shader ---------------------------------------------");
MAIN = new Shader("res/shaders/main");
FONT = new Shader("res/shaders/font");
LIGHT = new Shader("res/shaders/light");
LIGHT_AMBIENT = new Shader("res/shaders/light_ambient");
System.out.println("--------------------------------------------------------------------------------------");
}
public Shader(String file){
String vertexShader = "";
try {
vertexShader = IO.loadFile(file + ".vert");
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
vertexShader = loadShader(vertexShader,0,file + ".vert");
String fragmentShader = "";
try {
fragmentShader = IO.loadFile(file + ".frag");
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
fragmentShader = loadShader(fragmentShader,1,file + ".vert");
program = glCreateProgram();
int vert = glCreateShader(GL_VERTEX_SHADER);
int frag = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(vert, vertexShader);
glShaderSource(frag, fragmentShader);
glCompileShader(vert);
if (glGetShaderi(vert, GL_COMPILE_STATUS) == GL_FALSE) {
System.err.println(glGetShaderInfoLog(vert, 2048));
System.exit(1);
}
glCompileShader(frag);
if (glGetShaderi(frag, GL_COMPILE_STATUS) == GL_FALSE) {
System.err.println(glGetShaderInfoLog(frag, 2048));
System.exit(1);
}
glAttachShader(program, vert);
glAttachShader(program, frag);
glLinkProgram(program);
glValidateProgram(program);
System.out.println("Shader " + file + ".vert loaded with " + includeV + " include !");
System.out.println("Shader " + file + ".frag loaded with " + includeF + " include !");
}
public String loadShader(String shader,int a,String name){
String st = "";
BufferedReader reader = new BufferedReader(new StringReader(shader));
String buffer = "";
int line = 0;
try {
while ((buffer = reader.readLine()) != null) {
line++;
if(buffer.startsWith("#include")){
if(a == 0){
includeV++;
}else{
includeF++;
}
String path = buffer.substring(10, buffer.length() - 1);
String sh = IO.loadFile("res/shaders/" + path);
buffer += sh;
}else{
st += buffer + "\n";
}
}
reader.close();
} catch (IOException e) {
System.err.println("include file not found in " + name + " #" + line + " !");
System.exit(-1);
}
return st;
}
public void bind(){
glUseProgram(program);
}
public void unbind(){
glUseProgram(0);
}
public void uniform(String name,float v){
glUniform1f(glGetUniformLocation(program, name), v);
}
public void uniform(String name,Vector3f vec){
glUniform3f(glGetUniformLocation(program, name), vec.x,vec.y,vec.z);
}
public void uniform(String name,Matrix4f mat){
glUniformMatrix4fv(glGetUniformLocation(program, name),true, mat.getBuffer());
}
public void uniform(String name, Color4f v) {
glUniform4f(glGetUniformLocation(program, name), v.getR(),v.getG(),v.getB(),v.getA());
}
}