2D基于图块的引擎中的OpenGL行为:运动时像素“捕捉”,逼近错误?

时间:2010-12-16 08:17:51

标签: opengl-es raster

让我看看我是否可以清楚地问这个问题:

我正在OpenGL ES中编写一个基于2D磁贴的引擎,目的是让它看起来像一个老式的光栅引擎。我的艺术资产都是原始分辨率(也就是说,1:1像素艺术)并映射到矩形多边形,我的OpenGL视图是正交的,并且跨越矩形(0.0,0.0)到(screen.width,screen.height) )。我这样做是希望显示器上的每个像素都对应于XY坐标平面中的“虚拟”像素正方形,而这个正方形对应于我的一个贴片上的像素。 (瓷砖是16.0 x 16.0,我的世界的起源显然是[0.0,0.0]。)

由于近似误差,我确信我的引擎看起来很“假”。例如,我认为由于平铺像素没有直接写入显示器,因此偶尔会获取不正确的像素。我也确信每当瓷砖未与实际显示像素对齐时,相机运动会导致OpenGL进行插值。

事实证明,OpenGL的行为几乎与光栅引擎完全相同。当相机静止时,每个虚拟像素完全对应于显示器上的像素。当摄像机处于运动状态时,磁贴一次“捕捉”一个像素行/列,而不是通过插值平滑移动。 (即使动作非常缓慢,也会发生这种情况。)出于好奇,我尝试将我的瓷砖缩放到1.1x,正如我预期的那样,它们开始看起来很泥泞并且捕捉行为停止了。那么,OpenGL的表现是否正确,取决于它渲染的东西是否可以与显示器完美对齐?

在规范中我可以找到有关这些问题的信息,以及如何确保OpenGL继续以这种方式运行?我觉得使用我不太了解的默认值会感到不舒服,因为这种行为在理论上可以随时改变。

谢谢!

1 个答案:

答案 0 :(得分:3)

  

在规范中我可以找到有关此行为的信息,以及如何确保OpenGL继续以这种方式运行?

您需要阅读规范中的整个“光栅化”章节。它准确描述了保证的内容以及OpenGL实现应该如何工作;

  

使用我不太了解的默认值我感到很不舒服,因为这种行为在理论上可以随时改变。

右。据我所知,在你的情况下,行为是明确的。但是,请记住,规范为实现提供了一些自由,因此结果可能因实现而异。例如,在网格的x1.1缩放或20deg旋转中,边缘的精确raterization已经实现定义。

请注意,“snap”行为是预期的。您没有启用AA,因此OpenGL无法使移动更顺畅。