让我看看我是否可以清楚地问这个问题:
我正在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继续以这种方式运行?我觉得使用我不太了解的默认值会感到不舒服,因为这种行为在理论上可以随时改变.
谢谢!
在规范中的哪里可以找到有关此行为的信息,以及如何确保 OpenGL 继续以这种方式运行?
您需要阅读规范中的整个“光栅化”章节。它准确地描述了保证的内容以及 OpenGL 实现应该如何工作;
我对使用我不太理解的默认值感到不舒服,因为理论上该行为可能随时改变。
正确的。据我了解,在您的情况下,行为是明确定义的。但是,请记住,规范为实现提供了一定的自由度,因此结果可能因一种实现而异。例如,在网格的 x1.1 缩放或 20 度旋转中,边缘的精确分级已经由实现定义。
请注意,“捕捉”行为是预期的。您没有启用 AA,因此 OpenGL 无法使移动更加平滑。