1.什么是shader
着色器是控制屏幕上每个像素颜色的代码,这些代码通常在图形处理器上运行。
现如今游戏引擎使用先进的基于物理的渲染和照明。而且照明模型模型大多数是被锁定的。
因此我们创建着色器可以控制颜色,法线,粗糙度,金属度,即物体的表面属性,然后游戏引擎自己会为物体照明,着色器控制的是材质属性,就像上面说的那些,而不是光线。

所以我们创建着色器时就专注于左栏的内容,让游戏引擎为我们照明。
1.1介绍UE4材质编辑器的使用。
下面这个时材质的预览界面,右下角可以切换不同的形状,另外左上角还可以切换透视视图和正交视图

然后左上角这个地方可以切换不同选项来查看模型,右面的显示可以隐藏或者显示网格,背景或者统计数据。

2.PBR基础
1.什么是PBR
PBR是基于物理的渲染,过去计算机图形只是试图模仿光线的外观,但是使用PBR是在模拟光线的实际行为。这样可以创建更逼真的图像。
PBR有两个主要组成部分,光照属性和表面属性。
光照属性主要由游戏引擎本身控制,表面属性则是由创建的着色器定义它们

2.光照属性
首先先来了解一下光照属性。
光可以来自两种类型的光源:直接光源和间接光源。
直接光源:光从单个方向射入,直接照射到物体表面
间接光源:光从各个方向射入,并在周围环境中反弹,才到达物体表面
在光线照射到表面后,还会发生漫反射和镜面反射以及其它的一些现象,但是我们先来研究这两个最常见的现象。
镜面反射:在一个主要聚焦方向上离开表面
漫反射:在所有方向上离开表面

如果我们将入射和出射的情况结合起来,就会得到四种主要的光表面相互作用

在现实中,这四个的区别几乎不存在,但在计算机图形学中,用这种方式来分解时很方便的,这样我们就可以开发出处理每一个情况的方法。
下面我们来看一下这四个的图像实例



3.表面属性
1.BaseColor

下面是一个基础颜色纹理的例子。
可以看到它是不包括任何光照或者阴影的,右下角是真实世界中一些物体的颜色的实际颜色

2.Normal
下面是一个法线贴图的示例

3.Specular

下面是一个Specular贴图的示例。
虽然反射贴图大部分都应该是0.5,但是很明显裂缝是不应该反射的,所以最好的反射贴图就是将一个裂缝的贴图*0.5.

4.Roughness

下面是粗糙度贴图示例

5.Metallic
当在材质编辑器的根节点给金属度赋值的时候,这本质上是两个材质或者两个着色器合一,会分别由一个着色器来定义金属物体和非金属物体,而你输入的值会决定你使用哪一个着色器

当金属度是0的时候,基础颜色会是物体的漫反射,输入到Specular的值会决定物体的反射率在0-8%之间。但是对于金属度为1的物体,输入的颜色会转变成反射率,并且无论向高光输入什么值都会被忽视掉,并且现在漫反射总是黑色。并且金属度是非黑即白的,因为世界上并没有介于金属与非金属之间的物体

如果一个物体的表面是金属的,那么它的SRGB 是要大于180的。下面这个是上面示例里鹅卵石的金属度贴图,很明显这并不是金属,所以它是黑色的。
另外还有一个AO贴图,虽然这个是光照属性里的,但是这里也说一下
这基本上是一个间接漫反射的乘数,这样物体就不会在不该有的地方得到漫反射。AO和法线贴图都是烘焙出来的
