Jim's GameDev Blog

为什么需要基于物理的渲染

2016-5-22

最近一直在学习 Physically Based Rendering,期间看了很多的资料,我也正在将一些自己感觉很有用的内容翻译成中文,加深学习和巩固。刚开始接触 PBR 这个概念的时候,觉得这是个很高深的理论,随着不断的学习,对其中一些概念也有了一定的了解,渐渐的看明白了这个黑盒中的一些脉络。而在这一过程中,最让我困惑的就是,为什么我们需要基于物理的渲染(PBR)?为了好玩,所以要使用这个技术?因为这是个新技术、新概念,所以要使用?因为 PBR 让我们的在技术层面上更高大上?因为大V都在推荐、别人都在用,所以我们也要用?这些原因都不是,下面我根据自己的理解来说明下,为什么需要 PBR。

说到 PBR 就不得不提传统的材质,如果你编写过传统的材质,就会明白其中的参数有很多的随意性以及技巧(tricks),这些技巧在各种光照条件、各种引擎下是不通用的。这也就造成了在某个渲染引擎下的材质效果,到了另一个渲染引擎下就完全出错了。这种不通用的渲染,同样造成了在创造美术资源时工作流的不一致。这里需要注意的是,即使你使用了 PBR,在两个引擎下的效果也可能会有差异,这并不是说 PBR 出了问题,首先要检查的是两边的光照环境是否是一致的,其次只要两边的效果都是物理正确的那就没什么问题了。你可以认为两边的效果都是对的,是某些参数或者实现细节上的差异,可以通过调整可控的参数来弥补这个差异。

2016-5-24:其实所谓的各种光照条件也指的是场景内部的光照变化。比如在同一个场景中要实现天气系统,那么一天中每个时刻的光照都是在发生变化的,这就造成了场景中物体的光照效果需要实时变化。这种情况下,如果使用传统的材质渲染方式,就需要很细致的去调整每一个物件的材质效果(Diffuse、Specular等),需要用一些 Tricks 来实现,并且最终实现出来的效果可能在一些情况下会显得很不自然(正午的时候太亮,夜晚的时候过暗而无法看清)。

你也许会说,我并不考虑跨渲染引擎的问题,只要最终用来发布产品的引擎渲染效果正确就可以了。关于这点,也可以找到使用 PBR 的理由,那就是不同的光照条件。所谓不同的光照条件,我认为最复杂的情况的也就是 Global Illumination。如果使用传统的材质来实现 GI,这会是一个异常复杂的过程,说它复杂并不是因为在计算上有多难,而是无法控制。为什么说是无法控制呢,回想下传统的高光材质,当我们调整 Specular 参数的时候,其实我们并不关心 Specular 这个值到底是多少,更多的是凭感觉。这就不好说了,因为每个人的感觉都是不同的。这还只是单光源的情况,扩展到 GI 的情况下,光照环境会更复杂,这就造成了很难再凭感觉对参数进行调整。即使暂时调整正确了,但当光照环境改变后,又必须重新调整。使用 PBR 后,我们还能将这种凭感觉的参数变成一种规范的标准,通过真实的(物理的)参数调整出真实的(物理的)材质效果。

既然 PBR 有那么多好处,那么我们是否必须使用呢?答案是否定的。这里打个比方,我把 PBR 比喻成矩阵运算,把传统材质比喻成简单代数运算。在普通情况下,我们完全可以用简单代数运算代替矩阵运算(矩阵运算本身也是一种代数运算),但是当复杂情况出现的时候(比如连续的矩阵变换),你会发现矩阵运算会变得无比方便、有效、可控。打这个比喻是为了说明,选择合适的方式做正确的事。如果你的渲染效果需要 GI 这样复杂的光照,那么毫无疑问选择 PBR,如果你的渲染没有 GI,那么是不是用 PBR 都是可以的,根据你自己的需求(前提是对这两种方案都有足够的认识)。

最后还是那么话,即使用了 PBR,并不能决定渲染出来效果一定就比传统材质来得好,关键还是要理解其中的原理,好的技术只是工具,如何利用好工具才是关键。