So i am trying to implement shaders on my own with lwjgl.
package necro.graphical;
import static org.lwjgl.opengl.GL11.GL_FALSE;
import static org.lwjgl.opengl.GL20.GL_COMPILE_STATUS;
import static org.lwjgl.opengl.GL20.GL_FRAGMENT_SHADER;
import static org.lwjgl.opengl.GL20.GL_VERTEX_SHADER;
import static org.lwjgl.opengl.GL20.glAttachShader;
import static org.lwjgl.opengl.GL20.glCompileShader;
import static org.lwjgl.opengl.GL20.glCreateProgram;
import static org.lwjgl.opengl.GL20.glCreateShader;
import static org.lwjgl.opengl.GL20.glGetShader;
import static org.lwjgl.opengl.GL20.glLinkProgram;
import static org.lwjgl.opengl.GL20.glShaderSource;
import static org.lwjgl.opengl.GL20.glUseProgram;
import static org.lwjgl.opengl.GL20.glValidateProgram;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import org.lwjgl.opengl.Display;
public class ShaderProgram {
private int shaderProgram, verShader, fragShader;
private String vertexShader, fragmentShader;
private StringBuilder vertexShaderSource;
private StringBuilder fragmentShaderSource;
/**
* !!! THIS MUST BE IN THE INIT METHOD!!! initializes shader program. Use
* load to load and then create() to create!
*
* @param verShader
* @param fragShader
*/
public ShaderProgram(String verShader, String fragShader) {
vertexShader = verShader;
fragmentShader = fragShader;
}
/**
* Load the shaders!
*/
public void load() {
shaderProgram = glCreateProgram();
verShader = glCreateShader(GL_VERTEX_SHADER);
fragShader = glCreateShader(GL_FRAGMENT_SHADER);
vertexShaderSource = new StringBuilder();
fragmentShaderSource = new StringBuilder();
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(vertexShader));
String line;
while ((line = reader.readLine()) != null) {
vertexShaderSource.append(line).append('\n');
}
} catch (IOException e) {
System.err.println("Can not load vertex shader! There is no :" + vertexShader);
e.printStackTrace();
Display.destroy();
System.exit(1);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
BufferedReader reader1 = null;
try {
reader1 = new BufferedReader(new FileReader(fragmentShader));
String line;
while ((line = reader1.readLine()) != null) {
fragmentShaderSource.append(line).append('\n');
}
} catch (IOException e) {
System.err.println("Can not load fragment shader! There is no :" + fragmentShader);
e.printStackTrace();
Display.destroy();
System.exit(1);
} finally {
if (reader1 != null) {
try {
reader1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@SuppressWarnings("deprecation")
/**
* Create and compile shaders!
*/
public void create() {
glShaderSource(verShader, vertexShaderSource);
glCompileShader(verShader);
if (glGetShader(verShader, GL_COMPILE_STATUS) == GL_FALSE) {
System.err.println("Vertex shader could not comple!");
Display.destroy();
System.exit(1);
}
glShaderSource(fragShader, fragmentShaderSource);
glCompileShader(fragShader);
if (glGetShader(fragShader, GL_COMPILE_STATUS) == GL_FALSE) {
System.err.println("Fragment shader could not comple!");
Display.destroy();
System.exit(1);
}
glAttachShader(shaderProgram, verShader);
glAttachShader(shaderProgram, fragShader);
glLinkProgram(shaderProgram);
glValidateProgram(shaderProgram);
}
/**
* Start using shader program!
*/
public void startShader() {
glUseProgram(shaderProgram);
}
/**
* Stop using shader program!
*/
public void stopShader() {
glUseProgram(0);
}
}
and using them
public class Game extends State {
ShaderProgram sp;
Texture grass;
MyGame mg;
public Game(MyGame myGame) {
mg = myGame;
}
@Override
public void init() {
grass = Loader.getTexture("img/grass.png");
sp = new ShaderProgram("shader.ver", "shader.frag");
sp.load();
sp.create();
}
@Override
public void render() {
sp.startShader();
Render.drawTexture(grass, 100, 100, 64, 64);
sp.stopShader();
}
@Override
public void update() {
}
}
And there is nothing i can do with them now… xD
how do i pass the values (exp. color) to the shader and use it?