首页 > 解决方案 > LWJGL glDrawArrays 不绘制

问题描述

我对 LWJGL 库有点陌生,我试图画一个简单的三角形。只有我的代码似乎没问题,它不会画出我的三角形。它也没有给出任何错误或其他任何东西。我到处搜索,但根本没有找到解决方案。有人有解决方案吗?

代码:

public class Cube {

private int width, height;

private int ID, bufferID;
private int count;
private float[] vertices;

public Cube() {
    vertices = new float[] {
            0, 0, 0,
            1, 0, 0,
            0, 1, 0,    
    };

    count = vertices.length / 3;

    FloatBuffer buffer = BufferUtils.createFloatBuffer(vertices.length);
    buffer.put(vertices);
    buffer.flip();

    ID = GL30.glGenVertexArrays();
    GL30.glBindVertexArray(ID);

    bufferID = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferID);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);

    GL20.glEnableVertexAttribArray(0);
    GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);
    GL30.glBindVertexArray(0);
    GL20.glDisableVertexAttribArray(0);
}

public void render() {
    GL30.glBindVertexArray(ID);
    GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, count);
    GL30.glBindVertexArray(0);
}

public int getWidth() {
    return width;
}

public void setWidth(int width) {
    this.width = width;
}

public int getHeight() {
    return height;
}

public void setHeight(int height) {
    this.height = height;
}

}

public class Launcher {

public static void main(String[] args) {
    Window window = new Window("Cube Wave", 800, 600);
    window.setBackground(1, 0, 1);
    window.setup();
}

}

public class Window {

private String title;
private int width, height;
private Vector3f color;

private long window;

private ArrayList<Cube> cubes = new ArrayList<Cube>();

public Window(String title, int width, int height) {
    this.title = title;
    this.width = width;
    this.height = height;
    setBackground(0, 0, 0);
}

public void setup() {
    if (!glfwInit()) {
        return;
    }

    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    window = glfwCreateWindow(width, height, title, NULL, NULL);

    if (window == NULL) {
        return;
    }

    GLFWVidMode monitor = glfwGetVideoMode(glfwGetPrimaryMonitor());
    glfwSetWindowPos(window, (monitor.width() - width) / 2, (monitor.height() - height) / 2);

    glfwMakeContextCurrent(window);
    glfwSwapInterval(1);

    GL.createCapabilities();

    glfwShowWindow(window);

    loop();
}

public long getWindow() {
    return window;
}

public void loop() {
    init();

    glClearColor(color.x, color.y, color.z, 1.0f);

    while(!closed()) {
        tick();
        render();
    }
}

public void render() {
    for(Cube cube : cubes) {
        cube.render();
    }
    glfwSwapBuffers(window);
}

public void tick() {
    glfwPollEvents();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
}

public void init() {
    cubes.add(new Cube());
}

public boolean closed() {
    return glfwWindowShouldClose(window);
}

public void setBackground(float r, float g, float b) {
    color = new Vector3f(r, g, b);
}

}

标签: lwjgl

解决方案


看来您的渲染功能有误。

下面是如何在渲染函数中使用 glDrawArrays 的示例。

public void render() {
    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);

    // bind the VBO and enable the attribute
    GL30.glBindVertexArray(ID);
    GL20.glEnableVertexAttribArray(0);

    GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, count);

    // disable the VBO and disable the attribute
    GL20.glDisableVertexAttribArray(0);
    GL30.glBindVertexArray(0);
}

此外,当您使用完缓冲区后,解除绑定缓冲区也被认为是最佳做法。所以你的初始化函数应该是这样的。

public Cube() {
    // ... vertex stuff

    ID = GL30.glGenVertexArrays();
    GL30.glBindVertexArray(ID);

    bufferID = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferID);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);

    GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);

    // unbind both the Array Buffer and the Vertex Array
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
    GL30.glBindVertexArray(0);
}

您可以从lwjgl wiki找到更深入的讨论和示例


推荐阅读