未绘制 Opengl 三角形

Opengl triangle not drawn

我正在尝试在屏幕上绘制一个简单的三角形。 window 得到正确设置,一切似乎都很好,我正在尝试实际绘制东西。我有以下代码,但由于某些原因它不起作用。

default_shader_program是函数代码后面显示的程序链接着色器

void window::run(void(*update)(), void(*draw)()) {
    while (glfwWindowShouldClose(wnd) == 0)
    {

        update();
        glClear(GL_COLOR_BUFFER_BIT);
        draw();
        GLuint vb;
        GLfloat data[12]{
            1.f, 1.f, 0.f,
            1.f, -1.f, 0.f,
            -1.f, 0.f, 0.f
        };


        glGenBuffers(1, &vb);
        glBindBuffer(GL_ARRAY_BUFFER, vb);
        glBufferData(GL_ARRAY_BUFFER, 12, data, GL_STATIC_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        GLuint va;
        glGenVertexArrays(1, &va);
        glBindVertexArray(va);

        glUseProgram(default_shader_program);
        glEnableVertexAttribArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, vb);
        glVertexAttribPointer(
            0,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
            3,                  // size
            GL_FLOAT,           // type
            GL_FALSE,           // normalized?
            0,                  // stride
            (void*)0            // array buffer offset
        );

        glDrawArrays(GL_TRIANGLES, 0, 3);
        glDisableVertexAttribArray(0);

        glfwSwapBuffers(wnd);
        glfwPollEvents();
    }

    glfwDestroyWindow(wnd);
}

着色器: 顶点着色器:

#version 330 core
layout(location=0) in vec3 vertexPosition;

void main() {
    gl_Position = vec4(vertexPosition, 1);
}

片段着色器:

#version 330 core
out vec3 color;

void main() {
    color = vec3(1.0, 0.0, 0.0);
}

是的,我知道,我正在缓冲数据并在 while 循环中做其他事情。我知道,它不应该那样做,但实际问题发生在其他地方,我想看看代码是否可以直接在循环内正常工作。

您的数组包含 9 个元素而不是 12 个,但这不会导致问题。

glBufferData 的第二个参数是以字节为单位的缓冲区大小。因此缓冲区的大小是 9*sizeof(GLfloat) 而不是 12:

glBufferData(GL_ARRAY_BUFFER, 12, data, GL_STATIC_DRAW);

glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(GLfloat), data, GL_STATIC_DRAW);