如果瓷砖多一点。超越天真的想象力的界限

图片



任何曾经考虑过2D复古加速器的图形部分如何工作的人,都会粗略地表示它是如何绘制这些臭名昭著的Tiles的,顺便说一下,根据定义,Tiles不必是矩形的。平铺就是平铺。是的,铁API的开发人员通常都理解这一点,因此相应地将方法称为drawRect而不是drawTile。任何矩形的确可以是图块,但反之则不正确!接下来的问题正在酝酿:为什么2D加速器只能持久地加速rect ...这个问题的简单答案是,对于简单的硬件而言,其他一切都太复杂了。但是在这里我会争论。下面可以提出对该基本抽象的至少一个简单但功能强大的扩展。



我很久没有写信给哈勃了。因为一直以来我都想做得完美……我患上了这种病。同时,哈勃(Habr)本人已大大降低了门槛,我仍然不写也没有写。因此,今天的这篇文章是在没有与朋友交谈的情况下就无需准备的。但是,有些朋友想与他们深入和彻底地交谈。



也许,让我恢复常规。如果这样的加法或减法易于阅读,匆忙地将其扔进油漆中,但至少足以澄清,那么叙述就不会充满细节,而是带有概念上的重音,并且像灯一样,曾经成为昂贵的哈伯阅读器。



换句话说,今天我正在寻找内容质量和我可以投入的时间之间的折衷。希望能谅解。



所以,让我们开始...



考虑一个样本的复制任意矩形区域的一般功能。我们看到这只是遍历行和遍历行元素的双循环:



图片



请注意,通常以x4遍历两个循环的遍历方向的组合来重复执行此代码块,以实现反射:



图片



另一种x2组合由dst [x] [y]的顺序排列给出,沿轴向反映y = x。

一路上,这8个反射选项都是90gr的倍数所有可能的旋转,它们的所有镜面反射都是从左到右。



现在,让我们看一下即使添加最少的基本元素也可以进行很大的修改。



也许对任何人都从未发生过,但是为什么瓷砖不能成为平行六面体呢?展望未来,我要说的是,此扩展的开销最小,因为要实现此扩展,您仅需每行增加几个增量:



图片



由于结合了x / y排列,我们得到了一个平行六面体,其一对边始终沿一个正交方向排列,而另两个边则成一定角度...这种廉价获得的琐事给我们带来了什么?好吧,首先,可以使用三个固定的投影:



图片



如果增量不是一个常数而是一个小数,则偏移角可以自由。可以完美地用于侧面滚动条中摇摆瓷砖的效果:



图片



对于在等轴测投影空间中的建筑物墙:



图片



请记住,讲分数并不必然意味着浮动支持!现代宠坏的程序员有时会忘记什么。 float是浮点数的小数,但是在此完全没有必要。实际上,任何具有双寄存器的处理器都可以“支持”小数固定点(不动点),在该处理器中,一对寄存器的上半部可以作为一个单独的值读取。此外,在这种情况下,不会添加任何一条额外的指令。 (好吧,除了斜率将在第256拍中设置),所有这些都是免费的,伙计们!



细心的读者应该归纳的另一个类似步骤是将此功能重复到内循环枚举的第二个边界。毕竟,我们可以分别解耦末端增量。然后,在一般情况下,我们将能够在正交线之一(作为三角形的特例)上绘制任何与底面相邻的梯形:



图片



那么,它们到底给了我们什么?您会想到的,但是您会立即猜到,在两个这样的绘制调用中,您只是从为此准备的图块集中的正交六边形或斜向菱形纹理化平面。顺便说一下,平铺案例在游戏行业中很普遍。



在J2ME时代
J2ME , . , ,



在加速器上为其提供硬件支持将是一件很不错的事情:



图片



其余描述的内容更多是附加功能,因为您可以更好地有目的地实施它。但是,如果我们仅讨论仅用颜色(或平面图案)填充图元,以便对现有游戏空间进行一些简单的添加……



同一对绘制调用就可以组成不限于细节的任何三角形(它只是沿着中间的一条正交线被切成两个一点,这与他的经典绘图算法非常相似)并且由此已经可以构建透视图。顺便说一句,例如,从梯形本身,基本上可以廉价地获得以下形式的垂直固定的3D投影DOOM1:

图片



如果愿意,您可以尝试使用填充来填充或多或少的大体素。根据投影的自由度,或多或少会花费抽奖机会。下面的前两个透视投影是固定的,但每个都有4个对称视图-共有8个显示角度。第三种是常见情况,仅垂直固定。绕垂直轴旋转,它将在第一个和第二个之间交替:



图片



最好将图形分割成梯形,如果可能的话,将其沿切割的正交方向拉长一些,因为附加的调用功能虽然不昂贵,但与仅外部循环的迭代相关联,希望这要少一些。实际上,即使对于绘制基本矩形算法也是如此,水平绘制比垂直绘制更有效。



可以在这些调用中对奖励功能执行透视纹理化,但是它需要实现分数缩放,并且与src和抽取系数的附加散度系数的引入相关,此外,这些散度系数需要在3D动力学中进行相当弯曲的计算,因此不建议这样做。简单的架构。



好吧,出于我的兴趣,在哈勃尔面前结束了报仇,我仍然不禁简要地解释增量系数的所有魔力来自代数的地方。在学校里教的直线y = kx + b的公式一次向我们打招呼两次。所有系数在它们的位置都派上用场:



图片



为什么我没有遇到具有这种图块实现的2D硬件加速器,我只能猜测:



  • Tile的概念实际上是一种固定的模式,没有人认为他们可以做更多...得到更多。
  • 谁也不想在这样的功能上花费几个时钟周期,因为他们没有分析概述的普遍后果,或者当时拥有简单游戏的开发人员并没有对它们产生需求。尽管如此,还是有mode7(一种用于实现透视纹理的作弊算法,即通过在硬件上输出矩形子图形片段并支持分数缩放来实现透视纹理)
  • 或者我还不够大,我需要继续...



All Articles