簡體   English   中英

OpenGL 2D紋理渲染太大,glViewport損壞

[英]OpenGL 2D texture rendering too large, glViewport broken

我已經用OpenGL和C編寫了一個小型平鋪游戲引擎,但似乎無法弄清楚問題出在哪里。 我的主循環如下所示:

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調用,它似乎會顯示紋理,但是它很大且在窗口的一角。 截圖: 截圖

正確繪制了紋理,因為如果按很大的比例進行縮放,則可以看到整個圖像。 y軸似乎也與我在gluOrtho2D調用中使用的東西發生了翻轉(通過使事件從圖像的x / y坐標中進行添加或減去,從y坐標中減去導致事件向下移動來發現)。 我開始感到沮喪,因為這是我能想到的最簡單的例子。 我正在使用SDL,並將SDL_OPENGL傳遞給SDL_SetVideoMode。 這里發生了什么?

glViewport似乎有問題,但可以肯定的是,您是否嘗試將顏色緩沖區清除為紫色?

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

還是您沒有在調整大小后調用glViewport

您還應該嘗試不使用SDL_FULLSCREEN和/或使用較小的窗口的代碼。 我通常從512x512或640x480的窗口開始,直到正確獲得視口和一些基本控件為止。

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

你可以試試

  glViewport(0, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT);

對於gluOrtho2D,參數為left,right,top,bottom,所以我可能會使用

  gluOrtho2D(0, SCREEN_WIDTH, 0, SCREEN_HEIGHT);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM