axicer

Shader.java

Jul 9th, 2017
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.63 KB | None | 0 0
  1. package fr.axicer.saintscube.render.shader;
  2.  
  3. import static org.lwjgl.opengl.GL20.*;
  4.  
  5. import java.io.BufferedReader;
  6. import java.io.File;
  7. import java.io.FileReader;
  8. import java.io.IOException;
  9. import java.net.URISyntaxException;
  10. import java.nio.FloatBuffer;
  11.  
  12. import org.joml.Matrix4f;
  13. import org.lwjgl.BufferUtils;
  14.  
  15. import fr.axicer.saintscube.util.Vector3D;
  16.  
  17. public class Shader {
  18.    
  19.     public static final Shader CHUNK = new ChunkShader();
  20.     public static final Shader SKYBOX = new SkyBoxShader();
  21.    
  22.     public int program,vs,fs;
  23.    
  24.     public Shader(String filename) {
  25.         program = glCreateProgram();
  26.        
  27.         vs = glCreateShader(GL_VERTEX_SHADER);
  28.         glShaderSource(vs, readFile(filename+".vs"));
  29.         glCompileShader(vs);
  30.         if(glGetShaderi(vs, GL_COMPILE_STATUS) != 1){
  31.             System.err.println(glGetShaderInfoLog(vs, 2048));
  32.             System.exit(1);
  33.         }
  34.        
  35.         fs = glCreateShader(GL_FRAGMENT_SHADER);
  36.         glShaderSource(fs, readFile(filename+".fs"));
  37.         glCompileShader(fs);
  38.         if(glGetShaderi(fs, GL_COMPILE_STATUS) != 1){
  39.             System.err.println(glGetShaderInfoLog(fs, 2048));
  40.             System.exit(1);
  41.         }
  42.        
  43.         glAttachShader(program, vs);
  44.         glAttachShader(program, fs);
  45.        
  46.         glLinkProgram(program);
  47.         if(glGetProgrami(program, GL_LINK_STATUS) != 1){
  48.             System.err.println(glGetProgramInfoLog(program, 2048));
  49.             System.exit(1);
  50.         }
  51.         glValidateProgram(program);
  52.         if(glGetProgrami(program, GL_VALIDATE_STATUS) != 1){
  53.             System.err.println(glGetProgramInfoLog(program, 2048));
  54.             System.exit(1);
  55.         }
  56.     }
  57.    
  58.     public void setUniform(String name, float v) {
  59.         glUniform1f(glGetUniformLocation(program, name), v);
  60.     }
  61.     public void setUniform(String name, int i) {
  62.         glUniform1i(glGetUniformLocation(program, name), i);
  63.     }
  64.     public void setUniform(String name, Vector3D v) {
  65.         glUniform3f(glGetUniformLocation(program, name), (float)v.x, (float)v.y, (float)v.z);
  66.     }
  67.     public void setUniform(String name, Matrix4f mat){
  68.         FloatBuffer buffer = BufferUtils.createFloatBuffer(4*4);
  69.         mat.get(buffer);
  70.         glUniformMatrix4(glGetUniformLocation(program, name), false, buffer);
  71.     }
  72.    
  73.     public void bind(){
  74.         glUseProgram(program);
  75.     }
  76.     public static void unbind(){
  77.         glUseProgram(0);
  78.     }
  79.    
  80.     private String readFile(String filename){
  81.         StringBuilder string = new StringBuilder();
  82.         BufferedReader br;
  83.         try {
  84.             br = new BufferedReader(new FileReader(new File(Shader.class.getResource("/shaders/"+filename).toURI())));
  85.             String line;
  86.             while((line = br.readLine()) != null){
  87.                 string.append(line);
  88.                 string.append("\n");
  89.             }
  90.             br.close();
  91.         } catch (IOException | URISyntaxException e) {
  92.             e.printStackTrace();
  93.         }
  94.         return string.toString();
  95.     }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment