OpenGL创建指定尺寸窗口后绘制三角形异常,调整窗口后恢复正常求助
解决OpenGL初始窗口三角形显示过小的问题
嘿,这个问题我刚入门OpenGL的时候也踩过一模一样的坑!咱们来一步步拆解原因和解决方案:
问题根源
你一开始硬编码了glViewport(0, 0, 1024, 768),但这里有个容易忽略的点:GLFW创建窗口时,窗口的逻辑尺寸(你传入的1024x768)和帧缓冲的实际像素尺寸可能不一致!
比如在高DPI显示器(像Mac的Retina屏、Windows开启125%/150%缩放)上,系统会自动放大窗口的像素密度,帧缓冲的实际大小会是你指定尺寸的2倍甚至更多。这时候你设置的视口只占了帧缓冲的一小部分,所以三角形就被压缩到角落显示得很小。而调整窗口大小时,回调函数里的width和height是帧缓冲的实际像素尺寸,视口匹配后三角形就正常显示了。
完整解决方案
1. 初始化时获取真实帧缓冲大小设置视口
不要硬编码视口尺寸,而是先获取帧缓冲的实际像素大小:
GLFWwindow* window = glfwCreateWindow(1024, 768, "Hello Triangle", NULL, NULL); // 获取帧缓冲的实际像素尺寸 int fbWidth, fbHeight; glfwGetFramebufferSize(window, &fbWidth, &fbHeight); // 用真实尺寸设置视口 glViewport(0, 0, fbWidth, fbHeight);
2. 修正帧缓冲回调函数的拼写错误
你代码里的heigh是拼写错误,要改成height,同时确保正确注册回调:
// 帧缓冲大小回调函数 void FramebufferSizeCallback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); cout << width << " " << height << endl; // 修正拼写错误 } // 在窗口创建完成后注册回调 glfwSetFramebufferSizeCallback(window, FramebufferSizeCallback);
补充说明
glfwGetWindowSize获取的是窗口的逻辑尺寸(你创建窗口时传入的数值),而glfwGetFramebufferSize获取的是实际像素尺寸,这才是OpenGL渲染需要的正确尺寸。- 回调函数会在窗口大小改变时自动触发,确保视口始终和帧缓冲尺寸匹配,不管怎么调整窗口大小,三角形都能正常显示。
内容的提问来源于stack exchange,提问作者Turfa Auliarachman
相关产品推荐
相关产品推荐

