package org.saintandreas.gl.shaders; import static org.lwjgl.opengl.GL11.GL_TRUE; import static org.lwjgl.opengl.GL20.GL_COMPILE_STATUS; import static org.lwjgl.opengl.GL20.glAttachShader; import static org.lwjgl.opengl.GL20.glCompileShader; import static org.lwjgl.opengl.GL20.glCreateShader; import static org.lwjgl.opengl.GL20.glDeleteShader; import static org.lwjgl.opengl.GL20.glGetShaderInfoLog; import static org.lwjgl.opengl.GL20.glGetShaderi; import static org.lwjgl.opengl.GL20.glShaderSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Shader { private static final Logger LOG = LoggerFactory.getLogger(Shader.class); private final String source; private final int type; int shader = -1; public Shader(int type, String source) { this.source = source; this.type = type; } public void attach(int program) { glAttachShader(program, shader); } public void compile() { try { int newShader = compile(source, type); if (-1 != shader) { glDeleteShader(shader); } shader = newShader; } catch (Exception e) { if (shader != -1) { glDeleteShader(shader); shader = -1; } throw e; } } public String getLog() { return getLog(shader); } // printShaderInfoLog // From OpenGL Shading Language 3rd Edition, p215-216 // Display (hopefully) useful error messages if shader fails to compile public static String getLog(int shader) { return glGetShaderInfoLog(shader, 8192); } public static int compile(String source, int type) { int newShader = glCreateShader(type); glShaderSource(newShader, source); glCompileShader(newShader); int compileResult = glGetShaderi(newShader, GL_COMPILE_STATUS); if (GL_TRUE != compileResult) { String log = getLog(newShader); LOG.warn("shader compile failed :" + log); glDeleteShader(newShader); throw new IllegalStateException("Shader compile error" + log); } return newShader; } }