3

我遇到了一个问题,即两个对象之间的连接处偶尔会出现一个像素孔,这些对象具有相同的一组顶点,但被转换为彼此相邻。我设法用一行简单的正方形重现了这一点。

正方形为 1 x 1 单位,中心为 0,0。我在一行中放置了一些这样的正方形,使用 glTranslatef 将每个正方形移动到位(在这种情况下,我提供的值始终是整数)。我发现当相机位于某些位置时,OpenGL 在这些正方形之间留下一个像素间隙,通过它我可以看到后面的任何内容(例如,我清除后台缓冲区的颜色)。将正方形顶点更改为角落中的 0,0 并不能解决问题。

示例代码:

glPushMatrix();
glTranslatef(0, 0, 0);
drawSquare();
glPopMatrix();

glPushMatrix();
glTranslatef(0, 0, 1);
drawSquare();
glPopMatrix();

glPushMatrix();
glTranslatef(0, 0, 2);
drawSquare();
glPopMatrix();

图像显示了这种情况。我在问题像素周围的屏幕截图中添加了一个红色圆圈。

图片

我不知道为什么会这样,在指定最终的“世界”坐标时,消除简单正方形的每平方平移是可能的(并解决了问题),在我第一次注意到问题的地方使用更复杂的几何图形不是很实用。

4

1 回答 1

3

我不知道效果叫什么,但我知道它是如何发生的。

如果两个多边形“共享”一条边,但该边的端点是根据不同的值计算的,则在生成的平移顶点坐标中总是会有一些错误。顶点坐标中的轻微错误会改变构成使用它的边缘的点,因此您会得到(1)重叠像素(通常不是那么大)和(2)丢失像素,如您的示例所示。

虽然您通常可以做出一些努力来最小化公共顶点的重复,但通常问题会变得困难。

例如,我的世界也有同样的问题。

一种可能的快速解决方法是使用非常小的放大系数(例如 1.00001)对受影响的对象应用比例变换。这将导致对象彼此轻微重叠,并应删除任何被忽略的像素。你的旅费可能会改变。

于 2012-04-27T03:37:16.447 回答