私は 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 コンテキストを破壊せずにこのサーフェスのサイズを変更できれば、問題は解決すると思います。