C OpenGL 2D纹理渲染太大,视口损坏

C OpenGL 2D纹理渲染太大,视口损坏,c,opengl,sdl,C,Opengl,Sdl,我用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) {

我用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;
}
初始化函数:(在主循环之前调用)

运行时,将显示一个黑屏。但是,如果我删除glViewport调用,它似乎会显示纹理,但是非常大,并且位于窗口的角落。截图:


纹理的绘制是正确的,因为如果按较大的比例缩放,我可以看到整个图像。y轴似乎也与我在gluOrtho2D调用中使用的方向相反(通过将事件与图像的x/y坐标相加或相减发现,从y坐标相减会导致图像向下移动)。我开始感到沮丧,因为这是我能想到的最简单的例子。我正在使用SDL,并将SDL_OPENGL传递给SDL_SetVideoMode。这是怎么回事?

glViewPort的前两个参数指定了视图的左下角

你可以试试

  glViewport(0, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT);
对于二维,参数为左、右、上、下 所以我可能会使用

  gluOrtho2D(0, SCREEN_WIDTH, 0, SCREEN_HEIGHT);

glViewport
似乎有问题,但请确定,您是否尝试将颜色缓冲区清除为紫色

我一直认为
glViewport
是一个视频/窗口功能,而不是OpenGL本身的一部分,因为它是窗口管理器和OpenGL子系统之间的中间层,并且使用窗口坐标。因此,您可能应该将其与其他SDL视频通话一起查看。我建议用完整的代码更新问题,或者至少用与视频/窗口子系统相关的部分更新问题

还是在调整大小后忽略了调用
glViewport


您还应该在不使用
SDL_全屏
和/或使用较小窗口的情况下尝试代码。我通常从一个512x512或640x480窗口开始,直到我得到正确的视口和一些基本控件。

不是答案,但它提醒我,我已经将屏幕宽度和屏幕高度设置为0(对于最大化的窗口),我忘记了在初始化代码中将它们设置为实际尺寸。图。我不是那个通灵的:)。
  gluOrtho2D(0, SCREEN_WIDTH, 0, SCREEN_HEIGHT);