已经2026年了,PBR渲染应该不是什么难事了,但令人倍感遗憾的是,时至今日,我们仍然缺少一篇通俗易懂的文章,来帮助学会Blinn-Phong光照模型的人来过渡到PBR光照模型。所以我打算写这样一篇文章,来解决这个问题。
所以这篇文章的重点并不是深入PBR的那些枯燥繁琐的原理,比如辐射度量学,光的物理性质等等,这些我们需要知道,但仅限于当个科普看看,不用深入太多。因为很多人学习PBR并不是为了自己研究出超越PBR的新算法,而只是学习如何快速的使用它,将其融入到自己的项目中来。
不知道大家最初学习PBR渲染的时候是什么反应,反正我第一次看见PBR光照的教程或者文章时,大概是这样一个表情:

不是,我们不应该是先学1+1=2,然后再学方程、再学函数和极限、再学导数、偏导数,再是积分、梯度、旋度之类的吗?当我学完Blinn-Phong再开始学PBR的时候,我感觉就像是刚学了PID算法,然后马上开始造火箭的感觉。
Blinn-Phong和PBR之间难道就没有任何缓冲区吗?没有任何一个过渡算法?就突然冒出来了PBR渲染?中间似乎缺少了一大段的内容,有一种明明看动画的第一集但是我少看了一个季的感觉。
无论如何,只要你熟悉Blinn-Phong光照模型,就可以阅读这篇文章。
为了便于阅读,文章分了上下两个部分,以及这次的项目基于Unity2022.3.6版本。
在第一节里,我试图讲清楚为什么PBR让人感觉困惑,这部分可以不用那么紧张,当成是简单的科普来看即可。
我用Unity的URP管线新建一个了一个项目,然后新建一个球体,为其赋予URP的默认材质,URP的默认材质就是基于某种PBR光照模型的。它的效果如下:

为了展示它的不同,我在旁边创建了另外一个球体,并为它编写了一个Blinn-Phong光照模型,一个简单又标准的实现。现在观察两者的区别,能看出最大的不同点在哪里吗?
能看出两者是完全不一样的,但相对来说,这种不一样是由于两者算法不同而呈现出来的直观的不同,但其实两者的差别不完全是最终呈现的结果不同,还有行为上的不同。现在我们做另外一件事,就是给现在的项目替换一个不同的天空盒材质,任何不同的天空盒都可以。结果如下图所示:

感受到了吗?我写的Blinn-Phong和之前的天空盒状态下是一模一样的,然而PBR材质的细节发生了很大的变化,它似乎受到了天空盒的变化的影响,从而它的环境光部分发生了变化。如果你的感受还是不够明显的话,我们可以再替换一个不同的天空盒。
