概要:介绍PBR材质的基本原理以及制作一个简单的PBR材质
参考资料:BASIC THEORY OF PHYSICALLY-BASED RENDERING
如有问题,多多指正。
侵删。
PBR即Physically-based rendering,基于物理的渲染。基于物理的渲染,即通过计算光线与物体表面的交互状态而实现模拟真实世界画面的一种渲染方式。通常用于影视特效,写实风格的游戏,工业领域。现实中的环境,肯定不止一种光源,而是有很多光源一起发生作用,光线互相交织在一起的。
光的组成包括:光源,颜色,亮度,衰减,强度,形状,以及无数的“线”。当光或者说光线打到物体上,可以发生两种反应,一种是折射,一种是反射。折射的光线会被吸收,或者被离散,而反射的光线则会继续进行反射作用。根据光的折射原理,光不是在物体的表面进行折射的,而是在第二表面,也就是进入物体第二表面之后,发生的折射效应,此时光线会被离散或吸收,吸收使得光的强度变小,而离散使得光的方向发生改变,强度则不会发生改变。而光在各种物体的表面,折射和反射的情况也是非常不同的,比如在粗糙的物体,物体的反射就会增多,光线经过多次漫反射,其光滑度就很低,比如毛衣,墙砖。
反射:当光线打到物体表面时,一部分光线会被反射,在法线的相对侧根据某个角度进行反弹,就好像一个篮球打在墙上,会被反弹回去,这个概念比较好理解,从法线的一侧,然后碰到表面,在法线另一侧进行反弹。而在光滑的表面,通过反射,就容易得到一种镜像的效果,也就是像镜子一样,比如拖的很干净的地面,因为光滑,反射就容易出现“镜像”的效果。
扩散:当然,光打在物体上,不止会发生反射,还有发生别的反应。比如有一些光线进入了物体内部,被物体吸收或者是转换成了热量。而发生反射的,则通过多次反射进入你的眼睛或者是摄像头,然后被你看到,这就是我们常说的“漫反射”。我们把这种光称之为diffuse light(散射光)。对于不同波长的光,散射光(diffuse light)的吸收和散射通常会大不相同,所以对于一个对象,我们要给它颜色,或者说,每个物体,其实都是有颜色的。而散射光部分光线的反射并不是有规律的反射,而是随机或者说非常混乱的反射,这部分光在进行计算的时候,会给一个反射率,作为计算这个“部分”的多少或者说反射的多少。
透明度;这个比较好理解,但是因为某些物体的属性,比如蜡烛甚至是人的皮肤,光线的散射会更复杂。如果一个物体表面足够薄,光线可以穿过该物体,这个物体就是“半透明的”,光线会到达里面那一层,要处理这种效果,不能简单使用颜色,而是需要特殊的阴影系统。而另外一种,“全透明”物体,也就是如玻璃,光线可以穿到另一边,在这个物体里面几乎不会发生散射。
金属:顾名思义,就是表现金属属性的一个参数。
Albedo英文原意是反照率,其实就是基础颜色或者贴图,在上文中我讲到,一个物体最基本的是会有颜色的,透明的物体物体,也是有颜色的,所以这个Albedo也就是基本的颜色(或贴图)。
表现物体的光滑度的一个参数,通常会与金属Metallic一起使用。
法线贴图就是在原物体的凹凸表面的每个点上均作法线,通过RGB颜色通道来标记法线的方向,你可以把它理解成与原凹凸表面平行的另一个不同的表面,但实际上它又只是一个光滑的平面。对于视觉效果而言,它的效率比原有的凹凸表面更高,若在特定位置上应用光源,可以让细节程度较低的表面生成高细节程度的精确光照方向和反射效果。
简而言之,就是使用该帖图,可以使画面更有立体感,同时丰富更多的细节。
高度贴图是使用法线投影进行渲染时存储源对象相对高度的灰度贴图。
可以将高度贴图作为目标对象上置换贴图。这是向低分辨率对象的边缘添加细节的方式,因为边缘本身不受发现凹凸贴图的影响。高度贴图在某些时候可以纠正法线贴图制作凹凸感时的错误,使物体表面的细节更加真实。
参考unity的官方文字:
The occlusion map is used to provide information about which areas of the model should receive high or low indirect lighting. Indirect lighting comes from ambient lighting and reflections, so steep concave parts of your model like a crack or a fold would not realistically receive much indirect light.
Occlusion texture maps are normally calculated by 3D applications directly from the 3D model using the modeller or third party software.
An occlusion map is a greyscale image, with white indicating areas that should receive full indirect lighting, and black indicating no indirect lighting. Sometimes this is as simple as a greyscale heightmap
for simple surfaces.
At other times, generating the correct occlusion texture is slightly more complex. For example, if a character in your scene
is wearing a hood, the inside edges of the hood should be set to very low indirect lighting, or none at all. In these situations occlusion maps will often be produced by artists using 3D applications to automatically generate an occlusion map based on the model.
上面的意思大概是,遮挡贴图是一种计算物体表面光线的强度贴图,通过使用它,可以对物体的每个部分的吸收到的光线进行区分,部分地方会受到较多的光线,而其他部分,则会受到更少的光线,这样可以更好地处理物体的明暗细节。在遮挡贴图中,白色的表示会吸收到更多的光线,而越黑的,则会吸收到更少的光线。
自发光:听字面意思就很清楚,可以使物体自身发光,因为生活中自发光的材质也有不少,如灯管,显示屏等。
以unity里面的standard材质为例,制作一个足球的PBR材质:
首先,足球肯定是需要一种颜色,或者是贴图的,根据足球的纹理,边缝是凹下去的,而球面的五边形是凸出来的,所以这里我们先找一张铺平的足球贴图,作为Albedo贴图
首先,使用PS绘制Noremal Map,也就是法线贴图
加上的效果如下,可以看到,中间的缝有了一点的凹凸感:
接下来是金属贴图,因为足球的表面其实是半光滑的,金属感肯定是没有的,但是在贴图上还是要进行设计。金属贴图为黑白图,越黑的部分不显示金属特性,越白的部分会显示金属特性,所以直接将Albedo的贴图作为金属贴图即可,调节光滑度进行调整。
而高度贴图则很不一样,黑的部分会凹下去,白的部分则会凸出来,所以我们需要把足球的贴图缝隙设计成黑色,其他设计成白色。
至于Occlusion Map,按理来说,足球的底下是暗的,上面应该亮一点,所以在ps里面尝试将左右两边的亮度减低
最后效果:
可以看到,足球的表面有了一种明显的凹凸感,但是因为贴图处理的不是特别好,所以显得有点模糊,这一点需要再进行细致的调整。