我使用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上下文无效并使所有纹理无效 .
Edit: 经过一些实验后,我认为黑色区域是最初创建的SDL_Surface的结果,它不符合窗口的大小 . 因此,如果我可以在不破坏GL上下文的情况下调整此表面的大小,我想它可以解决我的问题 .
1 回答
这是一个新手的错误,非常常见,我每隔6个答案写一次:你在
resize_view
中的代码是代码设置绘图状态,因此属于显示/绘图功能,你将场景绘制为初始绘图设置 . 使用SDL_GetWindowSize检索窗口大小,并在绘制之前设置视口和投影 .请记住,这是唯一合理的方法,因为在以后,您很可能想要添加一些HUD,或小 Map 或一些UI控件,当添加这些时,您必须重新设置视口和投影在渲染单个帧时多次 . 所以在一些窗口调整大小处理程序中设置视口和投影的所有turorial都有效地设置了一个"mental roadblock",这让人们在实现这些事情时苦苦挣扎 . 视口不遵循窗口大小的问题类似 .