更新时间 2019-11-10 18:19

天气效果分属于《极乐迪斯科》的开发日志

本页贡献者

五月
增0 改0 删0

基本信息

天气效果
原标题 WEATHER DUTY
原作者 Kuubass
原发表日期 2016年2月10日
原文链接 https://zaumstudio.com/2016/02/10/weather-duty/

大家好!现在Kinnas 和美术团队正忙着构思和建模,我则在做日夜循环和天气效果。主要难点在于用尽量少的预渲染像素(和最终游戏容量)做出尽可能多样的视觉效果。我们不想把白天和晚上,亦或是雨和雪等天气分成不同的背景图来渲染。

上面说的原因也是我们不采用纯2D而是用了非常基本的3D几何图形作为画布的原因。这样我们在引擎中摆放如人物这样的素材时,可以实现部分的实时阴影(见下)和视觉反馈。

  1. 室内 VS 室外光照
  2. 室外光照
  3. 快速天气生成器
  4. 雨会淋湿东西
  5. 不相关的

室内 VS 室外光照

Kinnas只谈过室内渲染,因为室内和室外光照是完全不同的工作,所需的优化方向,甚至着色器都不一样。

室内 VS 室外光照

两者之间的主要区别在于自然光的行为。室外随着时刻的变化,同个时间点的光照、阴影和方向,基本上都是一样的。对比来看,室内有来自窗户的光(也就是每个房间有自己的光照方向),还要根据窗户方向,调节白天不同时刻的光照强度和色温。后者是由Kinnas提到的光流贴图(Lightflow map)和上面的示意图实现的。

室外光照

由于室内很多弥散阴影(diffuse shadow)的投射方向都与窗户相对,我们可以用一张阴影贴图搞定日夜循环。室外,就没那么容易了。阳光下的阴影是非常不同的,因为日照方向是变化着的。要做出这样的阴影,我们将需要导入足够的几何图形始之有足够细节,但效果不会像采用光线追踪的预渲染的阴影那么好。

所以我们不那么干。

我们将为早、中、晚烘培阴影,并配合时间控制和天气戏法达到目的,让玩家不会注意到预渲染的痕迹。下面是从一张包含早中晚三个阴影的贴图的截取。

LOUIguY

6w0ayCZ

每个通道都代表一个特定的时刻,这些通道将叠加到背景的反照率贴图中。缺少颜色的地方是表示那一处是位于阴影中的,红、绿和蓝色的亮度表示该区域在对应时刻的光照强度。

这是数个阴影贴图和光影颜色分级(color grading)同时切换的效果:

8KWZDaS

我可能还会尝试一些想法,力争做到既好看,又能把阴影信息压缩到不用全尺寸RGB贴图的程度。
提一句,人物投射到背景上的阴影是实时的(基于我们超级简单的世界几何图形),此处尚有后续工作要做,这又是另一个复杂问题了,会另外写篇日志来讨论。

有些预烘培阴影状态的切换可以通过招来云层形成阴天做掩护,不过要是一天三次都这样就很可疑了。当玩家在室内外场景来回穿梭时,我们需要一些经典的纸牌戏法来转移注意力。

快速天气生成器

光有阴影和昼夜的变换还不够,世界需要有天气变化才更显真实。由于这两样东西不可分割,我还跳起了求雨舞。

天气数据

这个图表表示的是一段为期三天的天气,从一个温暖的雨夜开始,然后是半天下雪,在第三天早晨起雾了。

通过添加正弦函数生成随机但看起来可信的天气数据。

图表说明:

  • X轴:天数(整数是午夜,n+0.5是中午)
  • Y轴:温度/概率
  • 蓝色:气温
  • 红色:露点温度
  • 橙色:降水(红色减去蓝色)
  • 绿色:起雾概率

天气生成器会使用上面的数据和下面非常简单的规则:

  • 如果降水大于0,气温大于0,下雨。
  • 如果降水大于1.5,气温大于2,会有闪电。
  • 如果降水大于0,气温低于0,下雪。
  • 如果降水大于-0.5,绿色决定雾气的浓度。
  • 降水等级在-1和1之间,起不同程度的云量,从白云到阴天到阴云密布(其实应该叫做湿度)。

经过一些调整,这些功能和规则产生的大部分结果是有时早上会起一点雾的晴天,有时会下雨,偶尔会下雪,很少时候会闪电。

现在我们已经生成了气象数据,现在来调整我们的闪电和天气效果吧。

雨会淋湿东西

bejoVBL

我用了一张示意性的阴影贴图来遮挡从天上落下的任何东西。”阴影”覆盖部分保持干燥,而其他地方则会受雨、雪和冰雹等的影响。结果这成了一张很有趣的贴图。我可以调节生成器来模拟风。我可以添加湿水区域到背景的高光贴图(spec map)上,让它真的变湿。我可以使用边缘测定将凸出边缘和物体边缘下的地方在贴图中标记出来。通过一些努力,我甚至可以一点一点地将背景变湿,而不是一下全变湿。最终我可以使用太阳的阴影贴图让不同的地方以不同的速度变干。这些听起来像是个人热衷的小细节,我会在有机会的时候继续插播这方面的更新。我该回到主任务去了,比如日夜循环和真正的天气制造机。

不相关的

K7BNpjO

这是正在给某UI元素debug的法线。