我将 OpenGL 与 SDL 一起使用,并且我希望在调整窗口大小时将场景调整为窗口。由于未知原因,当窗口变大时,场景以初始窗口大小裁剪。
用于响应 SDL_VIDEORESIZE 调整视图的函数如下,其中 m_scene_{width,height} 是游戏看到的视图大小。
void screen::resize_view( width, height )
{
// t will force the scene to be rendered with the top left corner matching the
// one of the window.
int t;
if ( height < m_size.y )
t = m_size.y - height;
else
t = 0;
glViewport( 0, t, width, height );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho( 0, m_scene_width, 0, m_scene_height, -1, 0 );
glMatrixMode(GL_MODELVIEW);
}
要初始化窗口,我调用
SDL_SetVideoMode( m_scene_width, m_scene_height 32, SDL_OPENGL | SDL_RESIZABLE );
resize_view( m_scene_width, m_scene_height );
使用此代码,我有一个初始窗口,其大小与视图的大小相匹配。然后,如果我在一个或两个维度上减小窗口的大小,场景会被有效地拉伸以适应窗口,左上角保持固定。
但是,如果我在一个或两个维度上放大窗口,一旦窗口变得大于传递给 SDL_SetVideoMode() 的初始大小,场景就会在右侧和底部被裁剪。即使场景的内容被有效地拉伸到预期的大小,屏幕的这些部分仍然是黑色的。
请注意,如果我将 glClearColor() 设置为红色,这些部分仍然是黑色的。
我现在唯一的解决方案是在每次调整窗口大小时使用新大小调用 SDL_SetVideoMode(),这是不可接受的,因为它会使 Windows 上的 GL 上下文无效并使所有纹理无效。
编辑:经过一些实验,我认为黑色区域是最初创建的 SDL_Surface 的结果,它不遵循窗口的大小。因此,如果我可以在不破坏 GL 上下文的情况下调整这个表面的大小,我想它会解决我的问题。