我遇到了一个问题,即两个对象之间的连接偶尔会出现一个像素孔,它们具有相同的顶点集,但是被翻译为彼此相邻。我设法用一系列简单的正方形重现了这个。
正方形是1个单位乘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();
图像显示了这种情况。我在问题像素周围的屏幕截图中添加了一个红色圆圈。
我不知道为什么会这样,并且在指定最终的“世界”坐标时,可以消除简单正方形的每平方平移(并解决问题),使用更复杂的几何形状注意到这个问题不太实际。
答案 0 :(得分:3)
我不知道效果是什么,但我知道它是如何发生的。
如果两个多边形“共享”一条边,但该边的端点是根据不同的值计算的,那么在生成的平移顶点坐标中总会有一些error。顶点坐标中的轻微错误会改变组成使用它的边缘的点,因此您得到(1)重叠像素(通常不是那么大)和(2)缺少像素,如示例所示。
虽然您通常可以尽量减少常见顶点的重复,但一般来说问题可能会变得困难。
例如,我的世界有同样的问题。一种可能的快速解决方法是使用非常小的放大系数将比例变换应用于受影响的对象,例如: 1.00001。这将导致对象彼此重叠,并且应该删除任何被忽略的像素。你的里程可能会变化。