我已经用OpenGL和C编写了一个小的平铺游戏引擎,但我似乎无法找出问题所在我的主循环如下:

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

绘图块:
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;
}

初始化函数:(在主游戏循环之前调用)
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轴也似乎是从我在GLUCTORD 2D调用中使用的(通过使事件从图像的X/Y坐标中添加或减去而发现的,从Y坐标减去导致图像向下移动)而翻转的。我开始感到沮丧,因为这是我能想到的最简单的例子我正在使用SDL,并将SDL_OPENGL传递到SDL_SetVideoMode这是怎么回事?

最佳答案

看起来glViewport有问题,但为了确定,您是否尝试将颜色缓冲区清除为紫色?
我一直认为glViewport是一个视频/窗口功能,而不是OpenGL本身的一部分,因为它是窗口管理器和OpenGL子系统之间的中间部分,并且使用窗口坐标因此,您可能应该将其与其他SDL视频通话一起查看我建议用完整的代码更新问题,或者至少用那些与视频/窗口子系统相关的部分更新问题。
还是在调整大小后忽略了调用glViewport
您还应该在没有SDL_FULLSCREEN和/或窗口较小的情况下尝试代码我通常从一个512x512或640x480窗口开始,直到我得到了正确的视窗和一些基本控件。

关于c - OpenGL 2D纹理渲染太大,glViewport损坏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13364299/

10-11 19:08