基于2D图块的发动机中的OpenGL行为:运动中的像素“折断”,近似错误?

StackOverflow https://stackoverflow.com/questions/4458667

  •  10-10-2019
  •  | 
  •  

让我看看我是否可以明确地问这个问题:

我正在用OpenGL ES编写一个基于2D的引擎,目的是使其看起来像老式的栅格发动机。我的艺术资产全部都处于本地分辨率(也就是说,1:1像素艺术)并映射到矩形多边形上,我的OpenGL视图是正交的,并跨越矩形(0.0,0.0)到(屏幕。 )。我这样做希望显示屏上的每个像素对应于XY坐标平面中的“虚拟”像素正方形,这又对应于我的一个瓷砖上的像素。 (瓷砖为16.0 x 16.0,我的世界的起源显然是[0.0,0.0]。

我确定由于近似错误,我的引擎看起来会“假”。例如,我认为,由于瓷砖像素没有直接写入显示屏,因此有时可能会获取错误的像素。我还确信,每当瓷砖与实际显示像素对齐时,相机运动都会导致OpenGL插值。

事实证明,OpenGL的行为几乎完全像栅格发动机一样。当相机静止时,每个虚拟像素完全对应于显示屏上的像素。当摄像机运动时,瓷砖一次“捕捉”一个像素行/列,而不是通过插值顺畅地移动。 (即使运动非常慢,也会发生这种情况。)出于好奇,我尝试将瓷砖缩放到1.1倍,正如我所期望的那样,它们开始看起来泥泞,而折断行为停止了。那么,根据它的渲染内容是否可以与显示器完全一致?

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

谢谢!

有帮助吗?

解决方案

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

您需要在规范中阅读整个“栅格化”一章。它准确地描述了保证的内容以及OpenGL实施如何工作;

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

正确的。据我了解,在您的情况下,行为定义得很好。但是,请记住,该规范为实施提供了一些自由,因此结果可能从一个实施到另一个实施。例如,在网格的x1.1缩放或20级旋转中,已经定义了边缘的精确重新构造。

请注意,预期“快照”行为。您没有启用AA,因此OpenGL无法使运动更加顺畅。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top