我有一个包含OpenGL视口的SDL窗口。当用户通过拖动窗口边缘来调整窗口大小时,我希望(1)视口扩展以填充窗口,(2)视口内容保持静止。
例如:
如果将窗口的左边缘进一步向左拖动,则OpenGL视口中的对象X应保持静止。
我发现我在SDL_VIDEORESIZE事件上调用的代码不仅没有实现这一点,还导致了一些可怕的闪烁。
当窗口被调整大小时,这段代码似乎会将旧视口中心的内容转换为新视口中心。当使用GLUT而非SDL时,相同的代码表现符合我的预期——使用GLUT,通过拖动边缘调整窗口大小不会导致视口内容重新居中。
是什么原因造成了这种差异?我该如何解决它?
例如:
------------------------
| | |
| <------ | |
| | 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,通过拖动边缘调整窗口大小不会导致视口内容重新居中。
是什么原因造成了这种差异?我该如何解决它?