Search code examples
javaopengl3dlwjgl3d-engine

LWJGL 3 Not rendering anything, while successfully creating display


The problem

I am having trouble rendering absolutely anything with LWJGL 3. It will not render anything, whilst creating the GLFW display and clearing the color successfully.

The tools

  • Eclipse Neon (Java IDE)
  • LWJGL 3.1.1 build 16 with GLFW, JAWT and OPENGL bindings, natives.

The code

package init;

import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.nio.IntBuffer;

import org.lwjgl.glfw.GLFWErrorCallback;
import org.lwjgl.glfw.GLFWVidMode;
import org.lwjgl.opengl.GL;
import org.lwjgl.system.MemoryStack;

import exception.ExceptionHandler;
import util.Time;

import static org.lwjgl.glfw.Callbacks.*;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryStack.*;

public class DisplayInstance {
    
    public String title = "The SuperMatrix";
    public GraphicsDevice gd;
    public Game game;
    public Config conf;
    private long display;
    
    private GLFWErrorCallback glfwerrorcallback;
    
    public DisplayInstance(Game game) {
    
        this.gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        this.game = game;
        this.conf = Config.returnConfig(this);
        this.glfwerrorcallback = GLFWErrorCallback.createPrint(System.err);
        this.glfwerrorcallback.set();
        this.start();
        
    }
    
    public void start() {
        
        if (!glfwInit()) 
            ExceptionHandler.handleException(new IllegalStateException("Cannot initialize GLFW"));
        
        glfwDefaultWindowHints();
        glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
        glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
        
        this.display = glfwCreateWindow(this.conf.width, this.conf.height, this.title, 0, 0);
        if (this.display == 0L) {
            
            ExceptionHandler.handleException(new RuntimeException("Cannot create GLFW window"));
            
        }
        
        System.out.println(this.display);
        
        try (MemoryStack stack = stackPush()) {
            
            IntBuffer pWidth = stack.mallocInt(1);
            IntBuffer pHeight = stack.mallocInt(1);
            
            glfwGetWindowSize(this.display, pWidth, pHeight);
            GLFWVidMode mode = glfwGetVideoMode(glfwGetPrimaryMonitor());
            
            glfwSetWindowPos(this.display,
                    (mode.width()-pWidth.get(0))/2,
                    (mode.height()-pHeight.get(0))/2
                    );
            
        } catch (Exception e) {
            ExceptionHandler.handleException(e);
        }
        
        glfwMakeContextCurrent(this.display);
        glfwSwapInterval(1);
        glfwShowWindow(this.display);
        
        this.loop();
        
    }
    
    public void loop() {
        
        GL.createCapabilities();
        
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0,this.conf.width, 0, this.conf.height, -1, 1);
        glMatrixMode(GL_MODELVIEW);
        glDisable(GL_DEPTH_TEST);
        
        Time time = new Time();
        
        while(!glfwWindowShouldClose(this.display)) {
            
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glfwSwapBuffers(this.display);
            glfwPollEvents();
            glPushMatrix();
            
            glBegin(GL_QUADS);
            
            glColor3f(1,0,1);
            glVertex2f(0, 0);
            glVertex2f(0, 64);
            glVertex2f(64, 64);
            glVertex2f(64, 0);
            
            glEnd();
            
            glPopMatrix();
            
            float deltaSeconds = time.getDelta()/Time.SECOND;
            float fps = deltaSeconds;
            System.out.println(fps);
            
        }
        
        this.destroy();
        
    }
    
    public void destroy() {
        
        glfwFreeCallbacks(this.display);
        glfwDestroyWindow(this.display);
        
        glfwTerminate();
        this.glfwerrorcallback.free();
        
        this.game.stopGame();
        
    }

}

Thank you. Absolutely any help would be appreciated.


Solution

  • Alright, I finally found the answer.

    The cause of the problem

    The problem was that I called glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) right before I called glfwSwapBuffers(this.display):

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glfwSwapBuffers(this.display);
    

    This essentially means that I clear the buffers right before I show them.

    The fix

    To fix this, all I had to do is move glfwSwapBuffers(this.display) down to after the glPopMatrix() call. Here is how the loop() function looks like now:

        GL.createCapabilities();
    
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0,this.conf.width, 0, this.conf.height, -1, 1);
        glMatrixMode(GL_MODELVIEW);
        glDisable(GL_DEPTH_TEST);
    
        Time time = new Time();
    
        while(!glfwWindowShouldClose(this.display)) {
    
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glfwPollEvents();
            glPushMatrix();
    
            glBegin(GL_QUADS);
    
            glColor3f(1,0,1);
            glVertex2f(0, 0);
            glVertex2f(0, 64);
            glVertex2f(64, 64);
            glVertex2f(64, 0);
    
            glEnd();
    
            glPopMatrix();
            glfwSwapBuffers(this.display);
    
            float deltaSeconds = time.getDelta()/Time.SECOND;
            float fps = deltaSeconds;
            System.out.println(fps);
    
        }
    
        this.destroy();
    

    Everybody, have a great day!

    P.S. Please don't mind the FPS system, I'm still trying to figure it out.