0

私は SDL で OpenGL を使用しており、ウィンドウのサイズが変更されたときにシーンをウィンドウに合わせたままにしたいと考えています。理由は不明ですが、ウィンドウが大きくなると、初期ウィンドウ サイズでシーンがトリミングされます。

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 );

このコードでは、サイズがビューのサイズと一致する初期ウィンドウがあります。次に、ウィンドウのサイズを 1 つまたは両方の次元で縮小すると、シーンはウィンドウに合わせて効果的に引き伸ばされ、左上隅は固定されたままになります。

しかし、ウィンドウを 1 つまたは両方のサイズで拡大すると、ウィンドウが 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 に答える