最近呢作为一个非常菜非常萌新的美术,本人尝试自学了Substance Designer材质制作以及一些基本的打光技巧,但是一些文章和教程提到的所谓“光感”“体积感”“通透感”“层次感”之类的玄学词汇不仅没有找到详尽科学的解释,也没提供一个理想的公式化的解决方案,所以这令本来就没入门的我更是头痛,然而,在进行渲染管线开发的时候,能够留意到确实有一些可以量化的操作,来大幅度提升渲染效果,掩盖住一些美术制作的短板,这篇文章就详细介绍一下这类高效稳定对萌新友好的操作。
故事从材质制作开始,这一部分是确实没什么办法的硬碰硬环节,所以只能硬着头皮上,但是还是有一些奇妙的小技巧:
第一个技巧就是在无光照的情况下进行材质预览,纯灰色的反射和白色的镜头光可以很直观的感受到材质的物理属性,没有了诸如环境反射,灯光颜色之类干扰的因素,这里从灯罩的菲涅尔衰减度不难看出它是一个粗糙度在0.6-0.7左右的金属,以及少量的铁锈,对于这种圆滑的曲面,使用较为粗糙的金属可以有效减少场景中Bling Bling的元素,因为场景中闪烁的物件太多会让看客第一眼注意到这里,这并不是我们想要的。陶瓷,金属水壶没什么可说的,值得一提的是这里的木头,木头的纹路虽然已经尽本人所能了,但是依然制作的非常差劲,不过这问题并不大,因为这里在木头的Albedo上我们是使用了扫描材质的颜色,然后放置到暗处,让高度法线等物理信息对实际效果影响变得不那么大。
地面材质的制作同样无比粗糙,但还是那句话:问题不大。用一个Cell Map作为分割,首先在视觉效果复杂度上就要高于一块完整的地面,同时使用Flood Fill节点随机大量的色彩,即使配色再丑只要复杂度上去了看起来好像就没那么丑了。等一下我们还会用贴花对地面进行进一步处理,增加地面材质复杂程度。
接下来就是渲染部分,渲染部分可以做的Trick可就丰富得多了,第一个Trick是最原始的直接光照的颜色选择,用高对比度的冷暖色调,可以很大程度的减少场景细节,所以我们这里对月光和灯光分别使用了:(100, 166, 255)和(250, 187, 98)这两个颜色,其中前者的蓝色饱和度想必沿海地区的月光要略微偏紫色一点,饱和度也稍高一点,后者则是普通的灯光中偏红颜色,这两者都比照片里的颜色饱和度稍高一点,但是又没高太多,应该可以表现出一个不错的效果。
第二个Trick是对于材质的一个微调,众所周知,金属度PBR工作流的高光实现非常简单:lerp(0.04, albedo, metallic),而这个0.04纯粹是魔法常量,这在SD中基本没办法修改,而现实中许多有微孔的物体,是会吸收一些高光的,这就导致大多数时候值会低于0.04,个别时候会高于0.04,大概是0.05左右,这里我们只考虑低的。譬如木头,粗糙的木头有许多表面孔洞,即使是打磨过的桌子也不例外,因此我们将场景中的木头的高光度降低到0.027,这么做也是为了进一步掩盖纹理的丑陋。
第三个Trick是对贴花的使用,之前也讲过,为了增加材质复杂度,MPipeline提供了一套非常强大的Forward Decal,而Forward Path的超强优势这里就体现出来了,那就是可以使用物体本身的高度图进行混合,实现砖缝内污垢的效果:
可以看到,砖缝内外有比较明显的浓度差距
由于Tile based culling的原因,Decal运算效率较高,我们也在场景中摆上了大大小小的Decal,继续掩盖材质制作的不足。
到这里时基本可以开始烘焙了,第一次烘焙对于光照的强度没有什么把握,经过两次尝试后烘出一个高精度的光照效果:
由于使用的是第三方的烘焙器GPU Bakery,因此图片显示的精度和实际精度不一致,实际精度高很多
GPU Bakery中对于直接光的阴影偏移是使用了球面随机的,之前本人给某项目实现软阴影烘焙时也实现了类似的效果,其算法大致如此:
知道了算法原理后,我们就可以在桌子上使用量角器计算出一个合适的软阴影角度,也就比较容易一步到位调整出效果了。
到此光照的烘焙结果就比较满意,接下来我们就开始进行后处理阶段的Trick。
后处理阶段比较值得处理的是雾和景深。我们之前文章中讲过基于物理的雾效的实现,物理体积雾有Albedo,Emission, Transparency这三个特性,分别代表光线穿过雾时显示的颜色,雾本身自发光的颜色(照明弹燃烧弹等效果)。这个场景想要表现冷暖对比感,那么就有“暖雾+冷后效”和“冷雾+暖后效”两种办法,这两种本人都有所尝试,之后选择了第二种方法,之所以要这么选择是因为这个场景的镜头始终在室内,这也就意味着近处会是暖色为主而远处会是冷色为主,那么远处的雾就会比近处浓,如果使用暖雾,那么远处的暖色浓雾+冷色月光将会让画面色彩失调,所以这里从画面远近分布的情况决定使用冷色雾的方案。
那么问题又来了,刚才月光不是烘焙的吗?那怎么实现体积雾呢?这当然有很好的解决方法,我们使用一个低精度的Cascade Shadowmap只渲染体积雾不渲染物体就可以了。所以这里直接在管线中插入一个Bool变量决定是否要在Geometry Pass阶段计算太阳光就万事大吉了:
这样就有了室内灯光和月光都有雾的投影的效果了,增加了画面的平衡性:
对于景深调整,许多美术并没有使用物理的参数,而是纯凭感觉调,这毫无疑问是不正确的,因此我们需要点击屏幕的一个点就获得这个点到摄像机的线性投影距离。好在计算这个对于MPipeline来说并不困难,由于管线中每个渲染步骤都是以Scriptable Object的形式存储并实例化的,因此脚本可以直接获得某个渲染步骤,所以这里我们直接获得GeometryEvent,也就是负责渲染不透明物体的事件,并把读深度的工作插入到所有不透明物体渲染之后:
Compute Shader中启动一个1x1x1的Kernel把某个点的距离输送到Buffer中:
接下来,把鼠标放到你想聚焦的那个点上,按下空格,就可以得到这个点到摄像机的线性投影距离了,使用这个距离作为景深的Focal length非常合适,所以我们渲染的效果可以做到非常精准的景深表现:
总结:
在场景材质和打光方面,目前很少看到公式化,量化的规则统计与整理,所以本人一直处于一种叫天天不应叫地地不灵的状态,一问就是“体积感”“层次感”这些莫名其妙的词汇,确实让本人深感头痛。所以在本篇文章中,我们使用了一些把材质色彩和现实进行比对,公式化和计算化的灯光效果表现,以及对基于物理的雾效,后处理景深的使用等等。希望这篇文章能够起到抛砖引玉的效果,接下来能够看到更多工程化的场景制作技巧,以结束本人这种无头苍蝇式的学习研究,谢谢。
作者:MaxwellGeng
专栏地址:https://zhuanlan.zhihu.com/p/83671923
|