地面雾使用分层阿尔法四边形的适宜性?

一个分层的方法将使用一系列平行于地面排列的大质量的阿尔法纹理四边形,将所有介入的地形几何相交,以便在雾中以相当有效的方式提供地面雾的幻觉,从高处俯视,朝向地平线看(见下图)。

或者,主要基于着色器的方法将替代地计算密度作为到地面雾基底中的视野距离的函数,并基于此输出碎片值。

我不需要自己对每种方法进行性能testing ,我首先需要听取其他人的经验 (而不是猜测),分层的alpha纹理方法可能会对性能产生怎样的影响。 我特别要问,由于透支的影响(不知道你的平均桌面系统是如何填充率限制的)。 使用这种方法的游戏列表,特别是较老的游戏,将非常有用:如果这在DX9 / OpenGL2硬件之前是可行的,那么它对我来说可能工作的很好。

一个大问题就是这样的结果:

在这里输入图像描述

(图片来源于lume.com的Lume)

注意垂直雾级联是连续的还是平滑的。 OTOH,使用有纹理的四层,我只能假定当穿过它们时,层将是非常明显的 – 它们越稀疏,这就越明显。 这与每架飞机面对玩家的雾面相反,在这个地方,这种粗糙不太明显。

Solutions Collecting From Web of "地面雾使用分层阿尔法四边形的适宜性?"

既然你已经要求经验,这是我的。

早在我编写PS2游戏的时候,“分层阿尔法四边形”方法就是我们经常实现雾的一种方式。 偶尔会像地面雾一样,但更多的是全屏雾。 在任何情况下,它都能正常工作。 所以是的,这在前期片段着色的日子里是可行的。

那么,有点。 正如你所指出的那样,问题是如果你需要像屏幕截图中那样的平滑雾气,你需要一个相当荒谬的阿尔法四边形数量。

在PS2上,我们通常可以承担三至五层的地方。 这确实看起来像在你面前漂浮的雾的“墙”。 不止如此,填充率开始杀死我们的帧率。

通常情况下,这些四边形将在相机前面的固定距离处画出来,所以你从来没有得到过你提到的情况,“走过”其中的一个。 另一方面,通过使用这些固定的距离,当玩家移动时,世界其他所有东西都会穿过这些平面,这是一个非常明显的graphics故障。 几乎每个人都做了,但现在是不能接受的(除非你是出于文体的原因)。 (例外:有些人计算雾值是PS2等价于顶点着色器的一部分,这很有效,而且要快得多,但要求你的模型要高度细致,例如,你不可能有长墙,因为只有雾在墙角处计算,然后在墙的整个表面上涂抹,例如,如果你站在中间的旁边,那么墙就显得完全雾化了,例如,因为它只是testing它的雾度端点)

请注意,如果您将雾四处静静地放置在世界中(就像您提到的那样),那么您将无法得到非常平滑的雾的外观,就像您提供的图像一样 – 将会出现奇怪的重叠相邻的四边形取决于观众的方向。 这些重叠可能会出现条纹或梯形(如果四边形是无纹理)或作为丛(如果他们有纹理)。

但是让我们假设我们正在使用宽屏幕的四边形来做这个地面雾,并且使用这种方法在平坦的地面上做一些计算,使得这个方法非常平滑,相机直视前方 – 这是我们理想的情况。 我们假设HD分辨率为1920×1080,这使得我们的视界位于扫描线540上。假设我们具有到达地平线的一切可见性(即假设在到达地平线之前没有达到完全不透明的雾)。 在每条扫描线上有一个雾四开始和一个停止(为了获得平滑的雾),我们需要(540 * 2 ==)1080个雾四元组。 每个1080雾四元组将覆盖整个屏幕的水平范围,屏幕的一些垂直部分(最接近的雾化平面将触摸屏幕底部的几行像素,中间的将覆盖更多的行由于视角,最远的将覆盖像素的更less数量的行)。

我们来估计一下,平均来说,一架雾面飞机将覆盖约300行像素。 最近的将覆盖更less,最远的将覆盖更less,中间的行会覆盖更多。

有了这个估计,我们得到(1920×300 ==)576,000像素被平均雾四分之一接触。 整体来说,总共触及了6200万像素(576,000×1080 ==),整个“通过渲染大量半透明几何体来平滑雾化”效果。 而这个数字将会上升到更高分辨率的人群。 更重要的是,我们得到了相同数量的z缓冲区的testing,以及几乎相同数量的像素混合操作,因为所有这些透明层都一次又一次地相互绘制。 这是很多像素。

这是最好的情况 – 如果用户向下看或蹲下,您将获得更多的雾四边形的屏幕覆盖。

请注意,由于我们重叠1080四边形,所以我们可能需要为每个都设置约(1.0 / 1080〜=)0.0009的Alpha值,以便在查看所有1080个四边形时我们的雾达到完全不透明度。 (我们可以比这更高,但是这是假设我们想尽可能扩大范围的价值)。 请注意,此值不能表示为32位颜色值的alpha分量(256 * 0.0009〜= 0.237,因此如果您尝试将其舍入为0)。 您需要将OpenGL的0.0009值作为浮点值提供,以便完全可以工作。 (另外请注意,您实际上不希望在每个值上都设置相同的值 – 虽然我们定义我们希望在地平线下的每个扫描线上开始一个四分割,并完成一个四分线,以便为我们提供平滑的雾,但实际上却希望由于扫描线所覆盖的距离更远,因此那些远距离的雾四边形代表比较近的四边形空间更多的空间)

另外请注意,使用这种方法的雾混合将不能正确地工作,就像他们使用现代着色器 – 而不是使用这个百分比“在基础对象颜色和雾颜色之间进行混合”的计算,您可以获得1080 “到目前为止的颜色和由雾比例的雾颜色混合”的计算。 这意味着在对数衰减之后雾将会影响物体。 (也就是说,受到20个雾四面体影响的物体出现不到10个雾四面体影响的雾化量的两倍,因为在混合操作中,第一雾四面体有更多的影响)。

所有这一切都是说: 请只使用片段着色器。

不完全是。 它更简单,更便宜,实施更快,更容易,而且容易出错,让您重新回到真正的制作游戏,并且尽一切可能。 如果在当时甚至可能模糊的话,我们完全可以在PS2时代做到这一点。