我用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。这是怎么回事?
答案 0 :(得分:1)
glViewport
看起来有问题,但为了确定,您是否尝试将颜色缓冲区清除为紫色?
我一直认为glViewport
是一个视频/窗口函数,实际上并不是OpenGL本身的一部分,因为它是窗口管理器和OpenGL子系统之间的中间层,它使用窗口坐标。因此,您应该将其与其他SDL视频通话一起查看。我建议使用完整代码更新问题,或至少使用与视频/窗口子系统相关的那些部分。
或者是否在调整大小后忽略了调用glViewport
?
您还应该尝试不使用SDL_FULLSCREEN
和/或使用较小窗口的代码。我通常从512x512或640x480窗口开始,直到我得到视口和一些基本控件。
答案 1 :(得分:0)
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);