0

我将 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 上下文的情况下调整这个表面的大小,我想它会解决我的问题。

4

1 回答 1

0

这是一个新手错误,很常见,以至于我大约每隔 6 个答案就写一次:您拥有的resize_view代码是设置绘图状态的代码,因此属于您将场景绘制为初始绘图设置的显示/绘图功能。用于SDL_GetWindowSize在绘制之前检索窗口大小并设置视口和投影。

请记住,这是唯一合理的方法,因为稍后,您很可能想要添加一些 HUD、小地图或一些 UI 控件,当添加这些控件时,您必须重新设置视口和投影在整个渲染单个帧中多次。因此,在某些窗口调整大小处理程序中设置视口和投影的所有教程都有效地设置了某种“心理障碍”,这让人们难以实现这些事情。您的视口不遵循窗口大小的问题是相似的。

于 2012-12-08T10:06:42.340 回答