调整窗口大小时如何在SDL窗口中保持OpenGL视口不变?
|
我有一个包含OpenGL视口的SDL窗口。当用户通过拖动窗口边缘来调整窗口大小时,我希望(1)扩展视口以填充窗口,并且(2)保持视口的内容固定。
例如:
------------------------
| | |
| <------ | |
| | X |
| <------ | |
| | |
------------------------
如果将窗口的左边缘向左拖动,则OpenGL视口中的对象X应该保持静止。
我发现我在SDL_VIDEORESIZE事件上调用的代码不仅没有做到这一点,而且还引起了一些可怕的闪烁:
SDL_FreeSurface(window);
window = SDL_SetVideoMode(_w, _h, 32, SDL_OPENGL | SDL_RESIZABLE);
glViewport(0, 0, _w, _h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
const double w_2 = _w/2.0;
const double h_2 = _h/2.0;
gluOrtho2D(-w_2, w_2, -h_2, h_2);
// adjust model matrix
const double s_cosT = _scale*cos(_theta);
const double s_sinT = _scale*sin(_theta);
model[ 0] = s_cosT;
model[ 1] = s_sinT;
model[ 4] = -s_sinT;
model[ 5] = s_cosT;
model[12] = s_cosT*_x - s_sinT*_y;
model[13] = s_sinT*_x + s_cosT*_y;
glMatrixMode(GL_MODELVIEW);
glLoadMatrixd(model);
调整窗口大小时,此代码似乎要做的就是将旧视口中心的内容转换为新视口中心的内容。与GLUT而不是SDL-一起使用时,与GLUT相同,代码的行为与我预期的相同,通过拖动边缘来调整窗口大小不会导致视口的内容更新。
是什么造成了这种差异?我该如何解决?
没有找到相关结果
已邀请:
1 个回复
耐钨徒
因此,为了获得所需的行为,您应该在每次窗口移动/调整大小时(或在绘制所有内容的帧的开始处)将gluOrtho2D矩阵设置为以下值: