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

运行基于glew/glfw3的OpenGL代码仅显示白窗口无三角形

OpenGL空白窗口问题修复

核心问题点

  • 缺少缓冲区交换逻辑:GLFW默认启用双缓冲,绘制操作全部在后台缓冲区执行,必须调用glfwSwapBuffers(window)将后缓冲内容交换到屏幕显示的前缓冲,这是你看不到任何内容的最直接原因。
  • 颜色值范围不符合OpenGL规范:固定管线模式下颜色分量的取值范围是*[0.0, 1.0]*,你传入255会导致所有颜色分量溢出为最大值,最终呈现全白效果。
  • 缺少事件处理调用:渲染循环中没有调用glfwPollEvents()处理窗口系统事件,会导致窗口无响应,无法接收关闭等操作。
  • 潜在空指针风险:glfwGetFramebufferSize调用放在了窗口有效性判断之前,若窗口创建失败会触发空指针访问。

修复后的完整代码

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <cstdlib>

#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600

int main(void)
{
    GLFWwindow* window;
    // 初始化GLFW库
    if (!glfwInit())
    {
        return -1;
    }
    // 创建窗口和OpenGL上下文
    window = glfwCreateWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "kk", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    int screenWidth, screenHeight;
    glfwGetFramebufferSize(window, &screenWidth, &screenHeight);

    // 将窗口上下文设为当前线程的当前上下文
    glfwMakeContextCurrent(window);

    glViewport(0, 0, screenWidth, screenHeight); 
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, SCREEN_WIDTH, 0, SCREEN_HEIGHT, 0, 600); 
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    GLfloat first_triangle[] = {
        0, 0, 0,
        0,300,0,
        200,300,0,
    };

    GLfloat second_triangle[] = {
        200,300,0,
        400,300,0,
        400,600,0,
    };
    // 颜色值修改为0-1范围
    GLfloat color[] =
    {
        1.0f,0.0f,0.0f,
        0.0f,1.0f,0.0f,
        0.0f,0.0f,1.0f
    };
    // 主渲染循环
    while (!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT);
        
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);

        glVertexPointer(3, GL_FLOAT, 0, first_triangle);
        glColorPointer(3, GL_FLOAT, 0, color);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        glVertexPointer(3, GL_FLOAT, 0, second_triangle);
        glColorPointer(3, GL_FLOAT, 0, color);
        glDrawArrays(GL_TRIANGLES, 0, 3);

        glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_VERTEX_ARRAY);

        // 新增:交换缓冲和处理事件
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    
    glfwTerminate();
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:54:03