package org.newdawn.slick.tests.shader; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import org.newdawn.slick.AppGameContainer; import org.newdawn.slick.BasicGame; import org.newdawn.slick.Color; import org.newdawn.slick.GameContainer; import org.newdawn.slick.Graphics; import org.newdawn.slick.Image; import org.newdawn.slick.Input; import org.newdawn.slick.SlickException; import org.newdawn.slick.opengl.shader.ShaderProgram; import org.newdawn.slick.util.Log; /** * A simple shader test that inverts the color of an image. * @author davedes */ public class ShaderTest extends BasicGame { public static void main(String[] args) throws SlickException { new AppGameContainer(new ShaderTest(), 800, 600, false).start(); } public ShaderTest() { super("Simple Shader Test"); } private Image logo; private ShaderProgram program; private String log; private boolean shaderWorks, useShader=true; private boolean supported = false; private float elapsed; private GameContainer container; @Override public void init(GameContainer container) throws SlickException { this.container = container; logo = new Image("testdata/logo.png"); container.getGraphics().setBackground(Color.darkGray); supported = ShaderProgram.isSupported(); if (supported) { //we turn off "strict mode" which means the 'tex0' uniform //doesn't NEED to exist ShaderProgram.setStrictMode(false); reload(); } } private void reload() { if (!supported) return; //release the program and everything associated with it if (program!=null) program.release(); try { program = ShaderProgram.loadProgram("testdata/shaders/invert.vert", "testdata/shaders/invert.frag"); shaderWorks = true; //good idea to print/display the log anyways incase there are warnings.. log = program.getLog(); if (log!=null&&log.length()!=0) Log.warn(log); //set up our uniforms... program.bind(); program.setUniform1i("tex0", 0); //texture 0 program.unbind(); } catch (Exception e) { log = e.getMessage(); Log.error(log); shaderWorks = false; } } //@Override public void render(GameContainer container, Graphics g) throws SlickException { //bind the shader before rendering the image if (shaderWorks && useShader) program.bind(); g.drawImage(logo, 100, 300); //unbind the shader so that usual stuff renders OK if (shaderWorks && useShader) program.unbind(); if (shaderWorks) g.drawString("Space to toggle shader\nPress R to reload shaders", 10, 25); else if (!supported) g.drawString("Your drivers do not support OpenGL Shaders, sorry!", 10, 25); else g.drawString("Oops, shader didn't load!", 10, 25); if (log!=null && log.length()!=0) g.drawString(log, 10, 75); } @Override public void update(GameContainer container, int delta) throws SlickException { if (container.getInput().isKeyPressed(Input.KEY_SPACE)) useShader = !useShader; if (container.getInput().isKeyPressed(Input.KEY_R)) reload(); } }