5

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

我正在用 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.1 倍,正如我所料,它们开始看起来很泥泞,并且捕捉行为停止了。那么,OpenGL 的行为是否会根据其渲染的内容是否与显示器完美对齐而有所不同?

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

谢谢!

4

1 回答 1

3

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

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

使用我不太理解的默认值让我感到不舒服,因为理论上行为可能随时改变。

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

请注意,“捕捉”行为是预期的。您没有启用 AA,因此 OpenGL 无法使运动更平滑。

于 2010-12-16T08:44:13.753 回答