我正在为 iPhone 编写一个基于图块的游戏引擎,除了以下故障之外,它基本上可以正常工作。基本上,相机将始终将玩家保持在屏幕中央,并且它会移动以正确跟随玩家并在静止时正确绘制所有内容。然而,当玩家移动时,玩家行走的表面瓷砖会出现故障,如下所示:
http://img41.imageshack.us/img41/9422/movingy.png http://img41.imageshack.us/img41/9422/movingy.png
与静止状态相比(正确):
http://img689.imageshack.us/img689/7026/still.png http://img689.imageshack.us/img689/7026/still.png
有谁知道为什么会这样?
感谢到目前为止的回复。浮点错误也是我的第一个想法,我尝试稍微增加图块的大小,但这没有帮助。将 glClearColor 更改为红色仍然会留下黑色间隙,因此可能不是浮点错误。由于图块通常会使用不同的纹理,所以我不知道是否可以使用顶点数组(我一直认为必须将相同的纹理应用于数组中的所有内容,如果我错了,请纠正我),并且我不认为 VBO 在 OpenGL ES 中可用。将过滤设置为最近邻改进了事情,但故障仍然每十帧左右发生一次,并且像素结果意味着该解决方案无论如何都不可行。
我现在所做的事情和过去所做的事情之间的主要区别在于,这次我移动相机而不是世界上的静止物体(即瓷砖,玩家仍在移动)。我用来移动相机的代码是:
void Camera::CentreAtPoint( GLfloat x, GLfloat y )
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(x - size.x / 2.0f, x + size.x / 2.0f, y + size.y / 2.0f, y - size.y / 2.0f, 0.01f, 5.0f);
glMatrixMode(GL_MODELVIEW);
}
这样做有问题吗?如果有,有解决办法吗?
我的第一个猜测是浮点舍入误差 http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems。这可能会导致四边形的坐标稍微偏离,从而导致您看到间隙。要验证这一点,您可能需要尝试更改 glClearColor() 并查看间隙是否随之改变颜色。
解决此问题的一种方法是使瓷砖稍大一些。只需要非常小的增量(例如 0.0001f)即可覆盖此类错误。
或者,您可以尝试使用顶点数组 http://www.songho.ca/opengl/gl_vertexarray.html or a VBO http://www.songho.ca/opengl/gl_vbo.html存储地面网格(确保相邻的方块共享顶点)。我希望这能解决这个问题,但我不是 100% 确定 - 而且它也应该渲染得更快。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)