You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:OpenGL C++代码无法渲染三角形,仅显示空白屏幕

解决Core Profile下OpenGL无法渲染三角形的问题

嘿,我明白你这种明明编译链接都没问题,却死活看不到三角形的郁闷——我当初学OpenGL的时候也踩过这个坑!仔细看了你的代码,问题出在OpenGL 3.3 Core Profile对VAO的强制要求上:

Core Profile模式下,OpenGL要求所有顶点数据的配置(比如顶点属性指针、启用属性数组)必须关联到一个VAO(顶点数组对象),而你的代码里只创建了VBO,完全没碰VAO。兼容模式下会有默认VAO,但Core Profile直接砍掉了这个“福利”,所以你的顶点配置根本没被OpenGL识别到,自然就渲染不出东西了。

具体修改步骤

只需要在创建VBO之前,新增VAO的创建和绑定代码就行:

// 新增:创建并绑定VAO
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

绑定VAO之后,后续的glVertexAttribPointer和glEnableVertexAttribArray操作都会被存在这个VAO里,只要保持VAO的绑定状态(或者绘制前重新绑定),OpenGL就能正确读取你的顶点配置了。

修改后的完整关键代码片段

int main() {
    int width = 0, height = 0;
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    GLFWwindow* window = glfwCreateWindow(500, 500, "Test", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewExperimental = GL_TRUE;
    glewInit();
    glfwGetFramebufferSize(window, &width, &height);
    glViewport(0, 0, width, height);
    glfwSetKeyCallback(window, keyCallBack);

    // 新增VAO创建与绑定
    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    float triangle[] = { -0.5f, -0.5f, 0.0f, 0.5f, 0.5f, -0.5f };
    GLuint buffer = 0;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
    glEnableVertexAttribArray(0);

    // 后续着色器创建、绘制逻辑保持不变
    std::string vertexShader = "#version 330 core\n"
        "layout (location = 0) in vec4 position;\n"
        "void main()\n"
        "{\n"
        "gl_Position = position;\n"
        "}\n";
    std::string fragmentShader = "#version 330 core\n"
        "out vec4 color;\n"
        "void main()\n"
        "{\n"
        "color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
        "}\n";
    unsigned int program = createShader(vertexShader, fragmentShader);
    glUseProgram(program);

    while(!glfwWindowShouldClose(window)) {
        glfwPollEvents();
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        glfwSwapBuffers(window);
    }
    glfwTerminate();
    return 0;
}

改完之后再运行,应该就能看到那个橙色的三角形了!

内容的提问来源于stack exchange,提问作者Korsarq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:02:41