渲染正方形时的 OpenGL 黑屏

OpenGL black screen when rendering a square

本文关键字:OpenGL 黑屏 正方形      更新时间:2023-10-16

我正在尝试在Linux上使用openGL和GLFW渲染一个红色方块。但是,下面的代码只是生成一个黑色背景的窗口,我不知道为什么。GLCall 宏仅用于错误检查目的,而不是问题的原因。

int main(){
    Window window(1280, 720);
    float vertices[] = {-0.5f, -0.5f,
                         0.5f, -0.5f,
                         0.5f,  0.5f,
                         0.5f,  0.5f,
                        -0.5f,  0.5f,
                        -0.5f, -0.5f
                        };
    const char* vertexShader = "#version 330 coren"
                         "layout (location = 0) in vec2 position;n"
                         "void main(){n"
                         "gl_Position = vec4(position, 0.0, 1.0);n"
                         "}";
    const char* fragmentShader = "#version 330 coren"
            "out vec4 color;n"
            "void main(){n"
            "color = vec4(1.0f, 0.0f, 0.0f, 1.0f);n"
            "}";

    GLuint vao;
    GLCall(glGenVertexArrays(1, &vao));
    GLCall(glBindVertexArray(vao));
    GLuint vbo;
    GLCall(glGenBuffers(1, &vbo));
    GLCall(glBindBuffer(GL_ARRAY_BUFFER, vbo));
    GLCall(glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0));
    GLCall(glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW));
    GLuint vshader = glCreateShader(GL_VERTEX_SHADER);
    GLCall(glShaderSource(vshader, 1, &vertexShader, NULL));
    GLCall(glCompileShader(vshader));
    GLuint fshader = glCreateShader(GL_FRAGMENT_SHADER);
    GLCall(glShaderSource(fshader, 1, &fragmentShader, NULL));
    GLCall(glCompileShader(fshader));
    GLuint shader = glCreateProgram();
    GLCall(glAttachShader(shader, vshader));
    GLCall(glAttachShader(shader, fshader));
    GLCall(glLinkProgram(shader));
    GLCall(glUseProgram(shader));
    while(window.isOpen()){
        glClear(GL_COLOR_BUFFER_BIT);
        GLCall(glDrawArrays(GL_TRIANGLES, 0, 6));
        glfwSwapBuffers(window.getPointer());
        glfwPollEvents();
    }
    return 0;
}

我确信你必须包括glEnableVertexAttribArray(0);

尝试添加:

glEnableVertexAttribArray(0);

后:

GLCall(glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0));