移动时,OpenGL矩形会任意调整一个像素

时间:2015-09-25 00:56:54

标签: opengl animation

我在OpenGL中使用GL_LINE_LOOP绘制了一个小的2D矩形轮廓 - 非常标准的东西,由许多教程提供。矩形在空间中不旋转,其轴与屏幕对齐。我调用glTranslatef(x,y)让我的矩形在屏幕上移动。顶点坐标是屏幕宽度和屏幕高度的固定分数。

当矩形移动非常缓慢时,我注意到下边界或上边界可能比矩形的边界更早地移动,紧接着之后。这只是一个像素而且只是一瞬间,但是让动画看起来很难看。

抗锯齿是打开还是关闭无关紧要,但如果打开抗锯齿,则该线暂时显示为加倍(或加粗)。

我想知道这是否是OpenGL的标准配置,并且如果有一个命令我缺少以避免在为矩形设置动画时进行小尺寸调整。

1 个答案:

答案 0 :(得分:0)

根据说明,这很可能是您的问题:

  

顶点坐标是屏幕宽度和屏幕高度的固定分数。

理论上,这些坐标恰好位于两个像素之间的边界上。由于浮点不准确,结果是顶点可以在两个相邻像素中的任何一个内部结束。

为简化说明,假设您的窗口宽度为20像素,并使用NDC(标准化设备坐标)指定顶点。所以坐标范围是[-1.0,1.0]。将2.0坐标单位的范围分成20个像素意味着每个像素宽0.1个单位。然后,每个像素覆盖的坐标范围为:

[-1.0, -0.9], [-0.9, -0.8], [-0.8, -0.7], ... , [0.8, 0.9], [0.9, 1.0]

因此,如果您使用像素数的分数坐标,如-0.8,则该坐标位于两个像素之间的边界上。

如果您想要像素精确绘图,则可以通过使用像素中心的坐标获得更多成功。在上面的示例中,您将使用以下坐标来处理每个像素:

-0.95, -0.85, -0.75, ... , 0.85, 0.95

一般情况下,如果您的坐标范围从xMinxMax,并且您在该范围内有n像素,则像素k的中心坐标为:

xMin + ((k + 0.5) / n) * (xMax - xMin)