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

使用GLEW与GLFW的OpenGL程序无法绘制三角形求助

OpenGL Core Profile下三角形无法显示的修复方案

你的代码在搭配GLEW、GLFW使用OpenGL 3.3 Core Profile时,编译正常但无法显示红色三角形,核心问题是Core Profile强制要求使用顶点数组对象(VAO),而你的代码缺少VAO的创建与绑定步骤,导致顶点数据配置无法被OpenGL识别。

问题根源

OpenGL 3.2及以上的Core Profile取消了默认VAO,所有顶点属性的配置(比如glVertexAttribPointer、glEnableVertexAttribArray)必须关联到一个已绑定的VAO上。你的代码仅创建了VBO并配置了顶点属性,但没有将这些配置保存到VAO中,解绑VBO后OpenGL就找不到有效的顶点数据配置了,自然无法绘制图形。

修复步骤

  1. 初始化阶段创建并绑定VAO:在生成VBO前先创建VAO并绑定,后续的顶点属性配置会自动存储到这个VAO里。
  2. 确保绘制时VAO处于绑定状态:要么初始化后保持VAO绑定,要么在渲染循环中每次绘制前重新绑定VAO。

修正后的关键代码

下面是修改后的核心部分,完整代码可直接替换对应片段:

int main(void){
    // ... GLFW初始化、窗口创建、GLEW初始化代码保持不变 ...
    
    // 新增:创建并绑定VAO
    unsigned int vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    
    float positions[6] = {
        -0.5f, -0.5f,
        -.9f, .5f,
        0.5f, 0.5f
    };
    
    unsigned int buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    // 修正:sizeof(positions)已经是数组总字节数,无需再乘sizeof(float)
    glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);
        
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float)*2, 0);

    // 可以解绑VBO,但VAO建议保持绑定(或者后续绘制前再绑定)
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    
    // ... 着色器创建、绑定代码保持不变 ...
    
    while (!glfwWindowShouldClose(window)){
        glClear(GL_COLOR_BUFFER_BIT);
        // 如果之前解绑了VAO,这里要加:glBindVertexArray(vao);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    // 可选:清理资源,程序退出时系统会自动回收,但养成好习惯
    glDeleteVertexArrays(1, &vao);
    glDeleteBuffers(1, &buffer);
    glDeleteProgram(shader);
    
    glfwTerminate();
    return 0;
}

额外提示

  • 检查glBufferData的参数:原代码中sizeof(positions) * sizeof(float)是重复计算,sizeof(positions)已经包含了所有元素的字节数,直接使用即可。
  • 可以添加错误检查:在glLinkProgram、glValidateProgram后调用glGetError(),排查着色器程序链接是否存在隐藏问题。
  • 确认GLEW初始化成功:你的代码中glewInit()的判断已经做到,但可以打印当前OpenGL版本号(std::cout << glGetString(GL_VERSION) << std::endl;)确认环境是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:42:04