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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:00:45