调整窗口大小时如何在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.  Starting window

        |-------|                   2.  Resize left edge

        |---------------|           3.  Resize right edge
因此,为了获得所需的行为,您应该在每次窗口移动/调整大小时(或在绘制所有内容的帧的开始处)将gluOrtho2D矩阵设置为以下值:
int wind_x, wind_y;
SDL_GetWindowPosition(window, &wind_x, &wind_y);
gluOrtho2D(wind_x, wind_x + w, wind_y, wind_y + h);
    

要回复问题请先登录注册