GLFW调用glClear清屏时窗口左上角出现异常偏移问题求助
你的问题由两个核心错误导致:
- 未手动设置OpenGL视口:OpenGL不会自动根据窗口尺寸调整视口范围,默认视口参数可能和实际窗口尺寸不匹配,就会出现清屏区域偏移、无法铺满的情况。
- 未考虑高分屏DPI缩放的影响:你创建窗口时指定的400x400是逻辑尺寸,在开启了系统DPI缩放的设备上,实际帧缓冲的像素尺寸会大于400x400,二者不匹配也会引发偏移。
修改方案
- 在绑定OpenGL上下文后,首先获取窗口实际帧缓冲的像素尺寸,调用
glViewport设置视口完全覆盖帧缓冲 - 可选:注册窗口大小变化回调,窗口拉伸时自动更新视口,避免后续出现同类问题
- 你设置的
glClearColor(0.5f,0.5f,0.5f,1.0f)本身就是中灰色,想要白色背景把三个通道值都改成1.0f即可
修改后完整代码:
#include <iostream> #include <GLFW/glfw3.h> // 窗口大小变化回调,同步更新视口 void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); } GLFWwindow* window; int main(int argc, char **argv){ if(!glfwInit()) std::cout << "glfw failed to init" << std::endl; // 可选:适配高分屏缩放,窗口尺寸会跟随显示器DPI自动调整 glfwWindowHint(GLFW_SCALE_TO_MONITOR, GLFW_TRUE); window = glfwCreateWindow(400, 400, "firstWindow", NULL, NULL); if(!window) std::cout << "window creation failed" << std::endl; glfwMakeContextCurrent(window); // 注册帧缓冲大小变化回调 glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); // 初始化时手动获取一次帧缓冲尺寸,设置初始视口 int framebufferWidth, framebufferHeight; glfwGetFramebufferSize(window, &framebufferWidth, &framebufferHeight); glViewport(0, 0, framebufferWidth, framebufferHeight); while (!glfwWindowShouldClose(window)){ if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, GL_TRUE); // 想要白色背景改成 glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClearColor(0.5f, 0.5f, 0.5f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glfwSwapBuffers(window); glfwPollEvents(); } // 程序退出前释放资源 glfwTerminate(); return 0; }
内容的提问来源于stack exchange,提问作者lukis97
相关产品推荐
相关产品推荐

