运行基于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
相关产品推荐
相关产品推荐

