首页 文章

如何调整大小超过传递给初始SDL_SetVideoMode的大小的OpenGL视图?

提问于
浏览
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上下文无效并使所有纹理无效 .

Edit: 经过一些实验后,我认为黑色区域是最初创建的SDL_Surface的结果,它不符合窗口的大小 . 因此,如果我可以在不破坏GL上下文的情况下调整此表面的大小,我想它可以解决我的问题 .

1 回答

  • 0

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

    请记住,这是唯一合理的方法,因为在以后,您很可能想要添加一些HUD,或小 Map 或一些UI控件,当添加这些时,您必须重新设置视口和投影在渲染单个帧时多次 . 所以在一些窗口调整大小处理程序中设置视口和投影的所有turorial都有效地设置了一个"mental roadblock",这让人们在实现这些事情时苦苦挣扎 . 视口不遵循窗口大小的问题类似 .

相关问题