如何使用VAO和VBO在LWJGL3中渲染三角形? - 包含错误代码

时间:2018-03-27 21:35:18

标签: java rendering lwjgl vbo vao

过去三天我一直试图解决这个问题,但是徒劳无功。因此,我非常感谢任何帮助。我目前正在学习如何使用VBO和VAO绘制三角形,因此所有代码都包含在一个单独的“测试”类中。

package quad;

import java.nio.FloatBuffer;

import org.lwjgl.BufferUtils;
import org.lwjgl.glfw.GLFWVidMode;
import org.lwjgl.opengl.GL;

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

import static org.lwjgl.opengl.GL.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL30.*;


public class Quad {
    private long window;
    private final String WINDOW_TITLE = "The Quad: glDrawArrays";
    private final int WIDTH = 1920;
    private final int HEIGHT = 1080;
    // Quad variables
    private int vaoId = 0;
    private int vboId = 0;
    private int vertexCount = 0;

    private boolean running = false;

    public static void main(String[] args) {
        new Quad().start();
    }

    public void start() {
        running = true;
        setupOpenGL();
        setupQuad();

        while (running) {
            loopCycle();
            update();

            if(glfwWindowShouldClose(window)) {  
                running = false;
            }
        }

        destroyOpenGL();
    }

    public void setupOpenGL() {
        if(!glfwInit()) {
            throw new IllegalStateException("Unable to initialize GLFW!");
        }

        glfwDefaultWindowHints();
        glfwWindowHint(GLFW_VISIBLE, GL_FALSE);
        glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);

        window = glfwCreateWindow(WIDTH, HEIGHT, WINDOW_TITLE, NULL, NULL);
        if (window == NULL) {
            throw new RuntimeException("Cannot create window!");
        }

        glfwMakeContextCurrent(window);

        GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
        glfwSetWindowPos(window, (vidmode.width() - WIDTH) / 2, (vidmode.height() - HEIGHT) / 2);
        glfwShowWindow(window);

        GL.createCapabilities();

        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    }

    public void setupQuad() {       
        float[] vertices = {
                // Left bottom triangle
                -0.5f, 0.5f, 0f,
                -0.5f, -0.5f, 0f,
                0.5f, -0.5f, 0f,
                // Right top triangle
                0.5f, -0.5f, 0f,
                0.5f, 0.5f, 0f,
                -0.5f, 0.5f, 0f
        };

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

        vertexCount = 6;

        // Create a new Vertex Array Object in memory and select it (bind)
        // A VAO can have up to 16 attributes (VBO's) assigned to it by default
        vaoId = glGenVertexArrays();
        glBindVertexArray(vaoId);

        // Create a new Vertex Buffer Object in memory and select it (bind)
        // A VBO is a collection of Vectors which in this case resemble the location of each vertex.
        vboId = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, vboId);
        glBufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STATIC_DRAW);

        // Put the VBO in the attributes list at index 0
        glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
        // Deselect (bind to 0) the VBO
        glBindBuffer(GL_ARRAY_BUFFER, 0);

        // Deselect (bind to 0) the VAO
        glBindVertexArray(0);

    }

    public void loopCycle() {

        glClear(GL_COLOR_BUFFER_BIT);

        // Bind to the VAO that has all the information about the quad vertices
        glBindVertexArray(vaoId);
        glEnableVertexAttribArray(0);

        // Draw the vertices
        glDrawArrays(GL_TRIANGLES, 0, vertexCount);

        // Put everything back to default (deselect)
        glDisableVertexAttribArray(0);
        glBindVertexArray(0);
    }

    public void destroyOpenGL() {       
        // Disable the VBO index from the VAO attributes list
        glDisableVertexAttribArray(0);

        // Delete the VBO
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glDeleteBuffers(vboId);

        // Delete the VAO
        glBindVertexArray(0);
        glDeleteVertexArrays(vaoId);

        glfwDestroyWindow(window);
        glfwTerminate();
    }

    public void update() {  
        glfwSwapBuffers(window);
        glfwPollEvents();
    }    
}

注意:我已经现代化了this tutorial code example所以使用了LWJGL3(没有旧的显示等)。

乍一看,所有内容都能正常运行,但是当代码运行时,只有一个黑色的窗口(由glClearColor(0.0f, 0.0f, 0.0f, 0.0f)方法中的setupOpengl()设置。

为什么四边形没有出现?

0 个答案:

没有答案