2

每当我尝试填充 VAO 时,都会出现空指针异常

错误

Hello LWJGL 3.0.0a!
2.1 INTEL-10.0.86
Exception in thread "main" java.lang.NullPointerException
at org.lwjgl.opengl.GL30.nglGenVertexArrays(GL30.java:3265)
at org.lwjgl.opengl.GL30.glGenVertexArrays(GL30.java:3294)
at javaapplication73.Loader.createVAO(Loader.java:35)
at javaapplication73.Loader.loadToVao(Loader.java:27)
at javaapplication73.HelloWorld.initial(HelloWorld.java:139)
at javaapplication73.HelloWorld.loop(HelloWorld.java:120)
at javaapplication73.HelloWorld.run(HelloWorld.java:32)
at javaapplication73.HelloWorld.main(HelloWorld.java:154)
Java Result: 1

引发此异常的代码是此 Loader 类中的 createVAO 方法。

package javaapplication73;

import java.nio.FloatBuffer;
import java.util.ArrayList;
import java.util.List;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30;

public class Loader {

private List<Integer> vaos = new ArrayList<Integer>(); 
private List<Integer> vbos = new ArrayList<Integer>(); 

public RawModel loadToVao(float[] positions){
    int vaoID = this.createVAO();
    this.storeDataInAttributeList(0, positions);
    this.unbindVAO();
    return new RawModel(1, positions.length/3);

}

private int createVAO(){
    int vaoID = GL30.glGenVertexArrays();
    vaos.add(vaoID);
    GL30.glBindVertexArray(vaoID);
    return vaoID;
}

public void storeDataInAttributeList(int attributeNumber, float[] data){
    int vboID = GL15.glGenBuffers();
    vbos.add(vboID);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID);
    FloatBuffer buffer =storeDataInFloatBuffer(data);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
    GL20.glVertexAttribPointer(attributeNumber, 3, GL11.GL_FLOAT, false, 0, 0);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}

public void unbindVAO(){
    //unbind the array
    GL30.glBindVertexArray(0);
}


private FloatBuffer storeDataInFloatBuffer(float[] data){
    FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
    buffer.put(data);
    //need to flip between wright and read
    buffer.flip();
    return buffer;
}

public void cleanUp(){
    for (Integer vao : this.vaos) {
        GL30.glDeleteVertexArrays(vao);
    }

    for(Integer vbo : this.vbos){
        GL15.glDeleteBuffers(vbo);
    }
}
}

我不认为真的需要这门课,但这是我的主要课程

package javaapplication73;

import org.lwjgl.Sys;
import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;

import java.nio.ByteBuffer;

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

public class HelloWorld {

// We need to strongly reference callback instances.
private GLFWErrorCallback errorCallback;
private GLFWKeyCallback   keyCallback;

// The window handle
private long window;
private final int fpsCap = 120;

Loader loader = new Loader();
Renderer renderer = new Renderer();
private RawModel model;

public void run() {
    System.out.println("Hello LWJGL " + Sys.getVersion() + "!");
    try {
        init();
        loop();

        // Release window and window callbacks
        glfwDestroyWindow(window);
        keyCallback.release();
    } finally {
        // Terminate GLFW and release the GLFWerrorfun
        glfwTerminate();
        errorCallback.release();
    }
}

private void init() {
    // Setup an error callback. The default implementation
    // will print the error message in System.err.
    glfwSetErrorCallback(errorCallback = errorCallbackPrint(System.err));

    // Initialize GLFW. Most GLFW functions will not work before doing this.
    if ( glfwInit() != GL11.GL_TRUE )
        throw new IllegalStateException("Unable to initialize GLFW");

    // Configure our window
    glfwDefaultWindowHints(); // optional, the current window hints are already the default
    glfwWindowHint(GLFW_VISIBLE, GL_FALSE); // the window will stay hidden after creation
    glfwWindowHint(GLFW_RESIZABLE, GL_TRUE); // the window will be resizable

    int WIDTH = 1200;
    int HEIGHT = 800;

    // Create the window
    window = glfwCreateWindow(WIDTH, HEIGHT, "Not so Still Life", 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, keyCallback = new GLFWKeyCallback() {
        @Override
        public void invoke(long window, int key, int scancode, int action, int mods) {
            if ( key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE )
                glfwSetWindowShouldClose(window, GL_TRUE); // We will detect this in our rendering loop
            cleanUp();
        }
    });

    // Get the resolution of the primary monitor
    ByteBuffer vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
    // Center our window
    glfwSetWindowPos(
        window,
        (GLFWvidmode.width(vidmode) - WIDTH) / 2,
        (GLFWvidmode.height(vidmode) - HEIGHT) / 2
    );

    // Make the OpenGL context current
    glfwMakeContextCurrent(window);
    // Enable v-sync
    glfwSwapInterval(1);

    // Make the window visible
    glfwShowWindow(window);



}

private void loop() {
    // This line is critical for LWJGL's interoperation with GLFW's
    // OpenGL context, or any context that is managed externally.
    // LWJGL detects the context that is current in the current thread,
    // creates the ContextCapabilities instance and makes the OpenGL
    // bindings available for use.
    GLContext.createFromCurrent();

    // Set the clear color
    glClearColor(.3243f,0,.83251234f,0);

    // Run the rendering loop until the user has attempted to close
    // the window or has pressed the ESCAPE key.
    GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, 800, 0, 600, 1, -1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);



    while ( glfwWindowShouldClose(window) == GL_FALSE ) {
        // Clear the screen and depth buffer
    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
        initial();
        Render();
        glfwSwapBuffers(window); // swap the color buffers
        glfwPollEvents();
    }
}


public void initial(){
    System.out.println(glGetString(GL_VERSION));
    //Pre game stuff
    float[] verticies = {
        -0.5f, 0.5f, 0f,
        -0.5f, -0.5f, 0f,
        0.5f, -0.5f, 0f, 
        0.5f, -0.5f, 0f, 
        0.5f, 0.5f, 0f,
        -0.5f, 0.5f, 0f,
    };
    model = loader.loadToVao(verticies);
}

public void Render(){
    renderer.prepare();
    renderer.Render(model);
}

public void cleanUp(){
    System.out.println("CleanUp");
    this.loader.cleanUp();
}

public static void main(String[] args) {
    System.setProperty("org.lwjgl.librarypath", "/Users/Bayjose/LWJGL/lwjgl/native");
    new HelloWorld().run();
}

}

我正在编写此代码的计算机是 Macbook Pro 2014 型号,运行 osx Yosemite 10.10.1 不知道这是否与错误有关

4

0 回答 0