我正在尝试编写一个简单的Doom风格游戏,为此我决定编写一个块式引擎(与Minecraft很相似),但是我遇到了一个问题:这些块渲染得非常奇怪,部分那里没有穿过的街区.
当你从左边看四边形时会发生这种情况:
但是,当你从右边看时,一切看起来都很好: 
我们来看看代码,好吗?这是我初始化OpenGL的方式:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(fov, (float) Display.getWidth() / (float) Display.getHeight(), 0, -2);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
Run Code Online (Sandbox Code Playgroud)
我使用显示列表渲染块的面.我尝试使用VBO,但改为显示列表,因为我认为它们导致了问题.每个显示列表看起来大致相同:
glNewList(listTop, GL_COMPILE);
glBegin(GL_QUADS);
tex.bind();
glTexCoord2f(0, 0);
glVertex3f(x+0.0f, y+1.0f, z-1.0f);
glTexCoord2f(0, 1);
glVertex3f(x+0.0f, y+1.0f, z+0.0f);
glTexCoord2f(1, 1);
glVertex3f(x+1.0f, y+1.0f, z+0.0f);
glTexCoord2f(1, 0);
glVertex3f(x+1.0f, y+1.0f, z-1.0f);
glEnd();
glEndList();
Run Code Online (Sandbox Code Playgroud)
然后是渲染:
glClearColor(0, .5f, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
if(rTo)glCallList(listTop);
if(rBt)glCallList(listBot);
if(rFr)glCallList(listFront);
if(rBk)glCallList(listBack);
if(rLe)glCallList(listLeft);
if(rRi)glCallList(listRight);
glPopMatrix();
glLoadIdentity();
//Display.update() etc here
Run Code Online (Sandbox Code Playgroud)
那么,可能导致这个bug的原因是什么?有人有类似问题吗?
小智 5
我没有看到你正在启用DEPTH TEST,
glEnable(GL_DEPTH_TEST);
Run Code Online (Sandbox Code Playgroud)
此外,您必须清除每帧上的深度缓冲区.
尝试在渲染场景之前执行此操作,因为它看起来对象被错误地重叠.此外,我认为你不应该将投影矩阵中的近似值设置为零,因为它可能会在以后引起一些麻烦.