4

我正在为 iPhone 编写一个基于磁贴的游戏引擎,除了以下故障外,它通常可以正常工作。基本上,相机将始终将玩家保持在屏幕的中心,并且它会移动以正确地跟随玩家并在静止时正确地绘制所有内容。然而,当玩家移动时,玩家正在行走的表面瓷砖会出现故障,如下所示:

http://img41.imageshack.us/img41/9422/movingy.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);
}  

以这种方式做事有问题吗?如果有,有解决方案吗?

4

3 回答 3

2

我的第一个猜测是浮点舍入误差。这可能会导致四边形的坐标稍微偏离,从而导致您看到的间隙。为了验证这一点,您可能想尝试更改 glClearColor() 并查看间隙是否会随之改变颜色。

对此的一种解决方案是使瓷砖稍大一些。只需要一个非常小的增量(如 0.0001f)来覆盖这种错误。

或者,您可以尝试使用顶点阵列VBO来存储您的地面网格(确保相邻的正方形共享顶点)。我希望这可以解决这个问题,但我不是 100% 确定 - 它也应该渲染得更快。

于 2009-12-16T07:12:42.453 回答
0

它是由于过滤..使用钳位边缘并留下1或2像素边框..这就是为什么我们在glTexImage调用中有一个BORDER选项..


第 4 个参数从 0 变为 1

于 2009-12-30T14:22:52.587 回答
0

有时这是由边界纹素上的过滤问题引起的。您可以尝试在纹理参数中使用 GL_CLAMP_TO_EDGE。

于 2009-12-16T07:21:56.600 回答