2012-12-08 36 views
0

我使用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環境的情況下調整這個表面的大小,我想它會解決我的問題。

回答

0

這是一個新手的錯誤,如此普遍,我把它寫在大約每6個回答:你在resize_view擁有的代碼代碼設置繪圖狀態,因此屬於在顯示/繪圖您畫場景作爲初始繪圖設置功能。使用SDL_GetWindowSize檢索窗口大小,並在繪製之前設置視口和投影。請記住,這是只有合理的方式來做到這一點,因爲稍後,你很可能會想要添加一些HUD,或一個小地圖或一些UI控件,並且當這些控件被添加時,您必須重新在整個渲染單個幀期間多次設置視口和投影。因此,在一些窗口調整大小處理程序中設置視口和投影的所有內容都有效地設置了一種「精神障礙」,這讓人們難以實現這些目標。視窗不符合窗口大小的問題與此類似。

+0

SDL_GetWindowSize在SDL 1.2.15中不可用。我試圖跟蹤窗口的大小,並在繪圖函數的開頭移動了resize_view,但它不能解決任何問題。我認爲繪圖僅限於初始化時創建的SDL_Surface。 – Julien

相關問題