2012-11-13 51 views
2

我寫了一個小型的平鋪遊戲引擎,OpenGL和C,我似乎無法弄清楚問題是什麼。我的主循環是這樣的:OpenGL 2D紋理渲染過大,glViewport破損

void main_game_loop() 
{ 
    (poll for events and respond to them) 
    glClear(GL_COLOR_BUFFER_BIT); 
    glPushMatrix(); 
    draw_block(WALL, 10, 10); 
} 

draw_block:

void draw_block(block b, int x, int y) 
{ 
    (load b's texture from a hash and store it in GLuint tex) 
    glPushMatrix(); 
    glTranslatef(x, y, 0); 
    glBindTexture(GL_TEXTURE_2D, tex); 

    glBegin(GL_QUADS); 
    //BLOCK_DIM is 32, the width and height of the texture 
    glTexCoord2i(0, 0); glVertex3f(0, 0, 0); 
    glTexCoord2i(1, 0); glVertex3f(BLOCK_DIM, 0, 0); 
    glTexCoord2i(1, 1); glVertex3f(BLOCK_DIM, BLOCK_DIM, 0); 
    glTexCoord2i(0, 1); glVertex3f(0, BLOCK_DIM, 0); 
    glEnd(); 
    glPopMatrix; 
} 

初始化函數:(main_game_loop之前調用)

void init_gl() 
{ 
    glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glClearColor(0, 0, 0, 0); 

    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glDisable(GL_DEPTH_TEST); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
} 

當運行,這顯示黑屏。但是,如果我刪除glViewport調用,它看起來會顯示紋理,但很大,並且在窗口的角落。屏幕截圖: screenshot

紋理被正確繪製,因爲如果我通過一個巨大因子向外擴展,我可以看到整個圖像。 Y軸也似乎從我在gluOrtho2D調用中使用的內容(通過將事件添加到圖像的x/y座標或從y座標中減去會導致圖像向下移動中發現事件中發現)中翻轉出來。我開始感到沮喪,因爲這是我能想到的最簡單的例子。我正在使用SDL,並將SDL_OPENGL傳遞給SDL_SetVideoMode。這裏發生了什麼?

回答

1

看起來像glViewport問題,但舉可以肯定的是,你是否嘗試將顏色緩衝區清除爲紫色?

我一直認爲glViewport是一個視頻/窗口函數,實際上並不是OpenGL本身的一部分,因爲它是窗口管理器和OpenGL子系統之間的中介,它使用窗口座標。因此,您應該與其他SDL視頻通話一起查看。我建議使用完整的代碼更新問題,或者至少使用與視頻/窗口子系統相關的部分。

或者您是否在調整大小後省略了glViewport

您還應該嘗試沒有SDL_FULLSCREEN和/或較小窗口的代碼。我通常從512x512或640x480的窗口開始,直到我看到視口和一些基本的控件。

+0

不是答案,但它提醒我已將SCREEN_WIDTH和SCREEN_HEIGHT設置爲0(用於最大化窗口),並且我忘記將它們設置爲初始化代碼中的實際尺寸。 – chameco

+0

數字。我不*那*通靈:)。 – aib

0

glViewPort的前兩個參數指定的參數是左,右,上,視圖的左下方 http://www.opengl.org/sdk/docs/man/xhtml/glViewport.xml

您可以嘗試

glViewport(0, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT); 

對於gluOrtho2D底部 所以我會可能使用

gluOrtho2D(0, SCREEN_WIDTH, 0, SCREEN_HEIGHT);