我使用OpenGL和SDL,並且我希望在調整後者的大小時將場景調整到窗口。由於未知原因,當窗口變大時,場景會以初始窗口大小裁剪。如何調整OpenGL視圖的大小,使其大小超過傳遞給初始SDL_SetVideoMode的大小?
用於調整視圖以響應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環境的情況下調整這個表面的大小,我想它會解決我的問題。
SDL_GetWindowSize在SDL 1.2.15中不可用。我試圖跟蹤窗口的大小,並在繪圖函數的開頭移動了resize_view,但它不能解決任何問題。我認爲繪圖僅限於初始化時創建的SDL_Surface。 – Julien