LWJGL3:渲染三角形的代码不起作用

时间:2018-12-18 22:03:09

标签: java rendering lwjgl

private static int vao;

public static void main(String[] args)
{
    if(!glfwInit()) throw new IllegalStateException("Unable to initialize GLFW");

    long window = glfwCreateWindow(640, 480, "Test", NULL, NULL);
    if(window == NULL) throw new RuntimeException("Failed to create the GLFW window");

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

    glfwMakeContextCurrent(window);
    glfwShowWindow(window);
    GL.createCapabilities();

    createVao(new float[]
        {
            -1.0f, -1.0f, 0.0f,
            0.0f, 1.0f, 0.0f,
            1.0f, -1.0f, 0.0f
        }
    );

    while(!glfwWindowShouldClose(window))
    {
        glfwPollEvents();
        glClearColor(1, 0, 0, 1);
        glClear(GL_COLOR_BUFFER_BIT);
        glBindVertexArray(vao);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        glBindVertexArray(0);
        glfwSwapBuffers(window);
    }

    glfwDestroyWindow(window);
    glfwTerminate();
}

private static void createVao(float[] vertices)
{
    vao = glGenVertexArrays();
    glBindVertexArray(vao);

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

    int vboVertices = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, vboVertices);
    glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
    glDisableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glBindVertexArray(0);
}

我正在尝试学习如何使用LWJGL3渲染三角形,但一直难以弄清我的代码有什么问题。它似乎与我已阅读的三个不同的教程相匹配。我究竟做错了什么?它打开窗口并渲染红色背景,但是无论我做什么,它都不会渲染三角形。这就是我所看到的: screenshot

1 个答案:

答案 0 :(得分:0)

您的三角形很可能没有渲染,因为您没有使用着色器,如果需要,这里有一些有用的资源可用于了解着色器:
https://learnopengl.com/Getting-started/Shaders
https://youtu.be/AyNZG_mqGVE
https://youtu.be/4w7lNF8dnYw
https://youtu.be/WMYNP5SioP4
https://youtu.be/8n1GV99FJ2Y

了解了GLSL的工作原理及其用途后,您应该可以轻松地编写一个简单的着色器。渲染简单三角形所需的是将顶点着色器中的gl_Position设置为已传递的顶点的位置(可以使用layout (location = 0) in vec3 position获得该位置),其次,您需要创建一个着色器输出颜色并将其设置为白色(输出为vec4)

除了着色器之外,您不应该调用glDisableVertexAttribArray(0); 或每次渲染前都调用glEnableVertexAttribArray(1);