根据我在应用程序窗口周围绘制和移动正方形的程序的代码,我在调整应用程序窗口大小时遇到了麻烦。当我相应地处理调整大小并更改状态时,屏幕上应该绘制并且在调整大小之前的所有内容都消失了。我不知道为什么,因为在调整窗口大小期间没有任何对象内部坐标发生变化。
我的问题是谁能指出我正确的方向来解决我的问题。(代码编译得很好)
void ResizeWindow()
{
screen_width = event.resize.w;
screen_height = event.resize.h;
SDL_SetVideoMode(screen_width, screen_height, bpp, SDL_OPENGL | SDL_RESIZABLE | SDL_DOUBLEBUF);
glViewport(0, 0, screen_width, screen_height);
glMatrixMode(GL_PROJECTION);
glOrtho(0, screen_width, 0, screen_height, -1, 1);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
}
主循环:
while (running == true)
{
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_VIDEORESIZE: ResizeWindow(); break; // resizing called here
case SDL_QUIT: running = false; break;
case SDL_KEYDOWN: square.Handle_Input(down); break;
case SDL_KEYUP: square.Handle_Input(up); break;
}
}
square.Move();
square.Check_Collision();
glClear(GL_COLOR_BUFFER_BIT);
square.Draw();
SDL_GL_SwapBuffers();
}
在调整窗口大小之前,这一切都运行良好。
最佳答案
您可能遇到的一个问题是,使用 SDL 调整窗口大小会创建一个新的 OpenGL 上下文,这意味着您之前上传的所有内容(纹理、顶点缓冲区对象)和您设置的状态(如顶点数组指针)都将丢失。如果使用 SDL,您需要重新初始化它们。如果要保留它们,请不要使用 SDL 进行窗口管理。我推荐 GLFW。
这
void ResizeWindow()
{
screen_width = event.resize.w;
screen_height = event.resize.h;
SDL_SetVideoMode(screen_width, screen_height, bpp, SDL_OPENGL | SDL_RESIZABLE | SDL_DOUBLEBUF);
glViewport(0, 0, screen_width, screen_height);
glMatrixMode(GL_PROJECTION);
glOrtho(0, screen_width, 0, screen_height, -1, 1);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
}
是初学者 OpenGL 代码中最常见的反模式。影响绘图的绘图命令和状态管理属于绘图功能。也就是以下内容:
glViewport(0, 0, screen_width, screen_height);
glMatrixMode(GL_PROJECTION);
glOrtho(0, screen_width, 0, screen_height, -1, 1);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
如果您想要一个健壮的 OpenGL 程序,请永远不要(仅)将它们放入调整大小处理程序中。它们属于其他绘图命令。
关于opengl - 使用 OpenGL 和 SDL 处理窗口大小调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9138559/