Created
June 8, 2020 13:11
-
-
Save superblaubeere27/f0b25c60286d83aef2f1638f657a45dd to your computer and use it in GitHub Desktop.
Render GLSL Shaders in LWJGL
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package net.superblaubeere27.glslsandboxrenderer; | |
import org.lwjgl.*; | |
import org.lwjgl.glfw.*; | |
import org.lwjgl.opengl.*; | |
import org.lwjgl.system.*; | |
import java.io.IOException; | |
import java.nio.*; | |
import static org.lwjgl.glfw.Callbacks.*; | |
import static org.lwjgl.glfw.GLFW.*; | |
import static org.lwjgl.opengl.GL11.*; | |
import static org.lwjgl.opengl.GL20.glUseProgram; | |
import static org.lwjgl.system.MemoryStack.*; | |
import static org.lwjgl.system.MemoryUtil.*; | |
public class LWJGLMain { | |
// The window handle | |
private long window; | |
private GLSLSandboxShader glslShader; | |
public void run() { | |
System.out.println("Starting with LWJGL " + Version.getVersion() + "."); | |
init(); | |
loop(); | |
// Free the window callbacks and destroy the window | |
glfwFreeCallbacks(window); | |
glfwDestroyWindow(window); | |
// Terminate GLFW and free the error callback | |
glfwTerminate(); | |
glfwSetErrorCallback(null).free(); | |
} | |
private void init() { | |
// Setup an error callback. The default implementation | |
// will print the error message in System.err. | |
GLFWErrorCallback.createPrint(System.err).set(); | |
// Initialize GLFW. Most GLFW functions will not work before doing this. | |
if ( !glfwInit() ) | |
throw new IllegalStateException("Unable to initialize GLFW"); | |
// Configure GLFW | |
glfwDefaultWindowHints(); // optional, the current window hints are already the default | |
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); // the window will stay hidden after creation | |
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); // the window will be resizable | |
// Create the window | |
window = glfwCreateWindow(1280, 720, "Hello World!", NULL, NULL); | |
if ( window == NULL ) | |
throw new RuntimeException("Failed to create the GLFW window"); | |
// Setup a key callback. It will be called every time a key is pressed, repeated or released. | |
glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> { | |
if ( key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE ) | |
glfwSetWindowShouldClose(window, true); // We will detect this in the rendering loop | |
}); | |
// Get the thread stack and push a new frame | |
try ( MemoryStack stack = stackPush() ) { | |
IntBuffer pWidth = stack.mallocInt(1); // int* | |
IntBuffer pHeight = stack.mallocInt(1); // int* | |
// Get the window size passed to glfwCreateWindow | |
glfwGetWindowSize(window, pWidth, pHeight); | |
// Get the resolution of the primary monitor | |
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor()); | |
// Center the window | |
glfwSetWindowPos( | |
window, | |
(vidmode.width() - pWidth.get(0)) / 2, | |
(vidmode.height() - pHeight.get(0)) / 2 | |
); | |
} // the stack frame is popped automatically | |
// Make the OpenGL context current | |
glfwMakeContextCurrent(window); | |
// Enable v-sync | |
glfwSwapInterval(1); | |
// Enable platform-specific features like shaders | |
GL.createCapabilities(); | |
try { | |
this.glslShader = new GLSLSandboxShader("/noise.fsh"); | |
} catch (IOException e) { | |
// End execution | |
throw new IllegalStateException(e); | |
} | |
// Make the window visible | |
glfwShowWindow(window); | |
} | |
private void loop() { | |
long startTime = System.currentTimeMillis(); | |
// Set the clear color | |
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); | |
glColor4f(1.0f, 1.0f, 1.0f, 1.0f); | |
// Run the rendering loop until the user has attempted to close | |
// the window or has pressed the ESCAPE key. | |
while ( !glfwWindowShouldClose(window) ) { | |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer | |
int width; | |
int height; | |
float mouseX; | |
float mouseY; | |
try ( MemoryStack stack = stackPush() ) { | |
IntBuffer pWidth = stack.mallocInt(1); // int* | |
IntBuffer pHeight = stack.mallocInt(1); // int* | |
DoubleBuffer pMouseX = stack.mallocDouble(1); // int* | |
DoubleBuffer pMouseY = stack.mallocDouble(1); // int* | |
// Get the window size passed to glfwCreateWindow | |
glfwGetWindowSize(window, pWidth, pHeight); | |
glfwGetCursorPos(this.window, pMouseX, pMouseY); | |
width = pWidth.get(0); | |
height = pHeight.get(0); | |
mouseX = (float) pMouseX.get(0); | |
mouseY = (float) pMouseY.get(0); | |
} | |
this.glslShader.useShader(width, height, mouseX, mouseY, (System.currentTimeMillis() - startTime) / 1000f); | |
// Apply the shader to the whole screen | |
glBegin(GL_QUADS); | |
glVertex2f(-1f, -1f); | |
glVertex2f(-1f, 1f); | |
glVertex2f(1f, 1f); | |
glVertex2f(1f, -1f); | |
glEnd(); | |
glUseProgram(0); | |
glfwSwapBuffers(window); // swap the color buffers | |
// Poll for window events. The key callback above will only be | |
// invoked during this call. | |
glfwPollEvents(); | |
} | |
} | |
public static void main(String[] args) { | |
new LWJGLMain().run(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment