在OpenGL中移动相机时出现故障

时间:2009-12-16 07:01:39

标签: iphone opengl-es camera sprite

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

http://img41.imageshack.us/img41/9422/movingy.png

与静止(正确)相比:

http://img689.imageshack.us/img689/7026/still.png

有没有人知道为什么会这样?


感谢目前为止的回复。浮点错误也是我的第一个想法,我尝试稍微增加瓷砖的大小,但这没有帮助。将glClearColor更改为红色仍会留下黑色间隙,因此可能不是浮点错误。由于瓷砖一般会使用不同的纹理,我不知道是否可以使用顶点数组(我一直认为必须将相同的纹理应用于数组中的所有内容,如果我错了就纠正我),然后我不要以为VBO在OpenGL ES中可用。将过滤设置为最近邻居改进了一些事情,但是每10帧左右仍然会发生故障,并且像素结果意味着此解决方案无论如何都不可行。

我现在正在做的和过去做的主要区别在于,这次我正在移动相机而不是世界上的静止物体(即瓷砖,玩家仍然被移动) )。我用来移动相机的代码是:

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

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

3 个答案:

答案 0 :(得分:2)

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

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

或者,您可以尝试使用Vertex ArrayVBO来存储地面网格(确保相邻的正方形共享顶点)。我希望这可以解决这个问题,但我不是百分百肯定 - 而且它也应该更快。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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


第4个参数从0变为1