然后我讲一下,前向渲染对于我们来说并不是一个非常完整的解决方案。特别是 MSAA 对于比如说高光的锯齿并不是能够解决的很好。 那么我们在 Unity 里面是不是有别的更好的技术去解决它? 我在这里强调的是前向渲染对于多光源并不是非常有效率,包括刚才说的,可能只能支持 16 盏光源,再多它的帧率会下降的非常快。 即使是支持到 16 盏光源,也并不推荐你完全的用满它。 再一个是,比如说,我们很想使用一些特效,比如屏幕空间反射。但这个东西对于前向技术就没有办法实现,因为屏幕空间反射需要用到屏幕的几何信息,那怎么办?那我们是不是有一个更好的方法? 还真有。 大家想一想,我们做电影和做游戏的区别是什么? 做电影其实是一个追求质量的过程,做电影一帧可以渲染 1 个小时、2 个小时。但做游戏,或者说做 VR 内容开发,我们需要的是效率,一帧最多是十几毫秒。如果你超过 20 毫秒,那这一帧基本上完蛋。所以说,电影上的一帧可以一直渲染下去,直到它收敛为止。 那么,渲染在图形学里面其实就是一个不停采样的过程。 而抗锯齿根本的来源就是,一个渲染的图像,它缺少信息,大家如果是工科或理工科出身的,就知道 “奈奎斯特采样定理”。 我的采样频率要高于我最高频率的两倍,我就能完整地恢复出我需要的信息。 在渲染这个领域其实也是一样。 打个比方说,我们大家都知道,最简单的抗锯齿的方法是什么?你渲染一张 2k 的大图,把它缩小到 1k,那这张图肯定锯齿非常少。 为什么?因为这相当于我们对 1k 的图的每一个像素做了四次采样。但是实际上,你真的去渲染一个 2k 的大图,那么 VR 有 2k 我可能就要去渲染 4k,你这样去抗锯齿显然是不行的。 后来就有聪明人说,游戏最大的特点是连续性,那如果我能够找到每帧之间相同的像素,那我就能在时域,也就是说很多帧之间去做个采样。 就实现了个超采样,也就是所谓的 Super Sampling。 有的时候大家在数据信号处理的课里面,提到这个 Super Sampling。这个能够很好的提高画面的质量,最关键的是这个很便宜,或者说并不是很好,当然它的实现难度是有的。 我给大家看一个具体的例子。这个 Demo 挺有名的,使用虚幻引擎做的。这个是没用时域抗锯齿的结果,大家看到最大明显的特点是闪。因为,整个画面高光的东西太多了。如果说你不用抗锯齿,画面会非常不稳定。这个地方会特别的闪。 我们加上了时域抗锯齿的结果,是什么? 最大的特点就是整个画面非常稳定,这样看起来是不是就有电影级别画质的感觉。画面稳定、像素没有任何瑕疵,包括在高光的地方也不会闪,非常的稳定。 我刚才说的 Temporal AA一样的,在 asset store 上也可以找到一个还不错的实现。我不知道大家知不知道 limbo 这个工作室,可以去搜 limbo 的 taa,能够得到非常不错的 Temporal AA,也是直接在 GitHub 下载就可以了。 我想跟大家建议,要擅于利用包括 GitHub、Asset Store 这样的插件让我们的开发提升效率。 如果你想做很棒的产品,你必须要擅于利用这些前人已有的资源。 怎样解决全局光的问题? 然后,我再讲全局光的问题。 全局光问题历来是游戏里比较头痛的问题,特别是在 VR 里面更麻烦。 什么叫全局光照? 比如一个灯打到一块黑板上或者地板上,它投下来的影子那是直接光照。但如果它在地板上反射出去的光线照亮了其他物体,那这个就是全局光照。 全局光照一般是通过烘焙,也就是离线的方法把全局光照存成某种数据结构,在游戏实时运行时调用去实现的。 但在 VR 里面对于实时的运算是要进行严格的限制,所以我不推荐大家在 VR 里面使用实时的全局光照技术,比如说提速、mpv 这种技术。 我建议大家老老实实用标准的光照贴图,也就说烘焙一张贴图然后贴上去。 但是,Unity 又是一个非常麻烦的问题,Unity 自身所带的 enlighten 的烘焙,不是很好调出非常好的效果。 (责任编辑:本港台直播) |