c - OpenGL 2D 纹理渲染太大,glViewport 损坏

标签 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);
}

绘图 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。这是怎么回事?

最佳答案

看起来 glViewport 有问题,但为了确定,您是否尝试将颜色缓冲区清除为紫色?

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

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

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

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

相关文章:

OpenGL 是否足够稳定以支持 24/7 运行程序?

iphone - 如何从“顶点缓冲对象”绘制单个三角形并设置其颜色?

c++ - 简单的跨平台 C++ GUI 控制台——如何?

c++ - SDL2修改像素

c - 交叉编译C代码时出错--未知类型名称 '__syscall_slong_t'

c - 在哪里创建宏变量?和变量的大小?

opengl - 如何在 Matrix4f 中获取当前的 OpenGL 变换矩阵?

c++ - 如何从原始位图数据到 SDL 表面或纹理?

c - 链接列表创建 - 程序在接受输入后停止工作

c++ - C/C++ linux fork() 和 exec()