模型与材质
想要在游戏里渲染出好看的画面,我们首先要有模型和相应的材质通过cpu提交相关信息给gpu,那么这些模型和材质到底包含了什么东西呢?
模型
1.
模型实际上就是若干个点按照一定的顺序连成线,线连成面,面连成多边形模型。
2.模型文件
在unity中我们常用的模型文件有OBJ和FBX,我们来看看文件中包含了什么。
以OBJ文件为例:
v(vertex)代表顶点坐标数据,即模型空间中某个顶点的XYZ坐标。
vt(vertex Texcoord)代表顶点纹理坐标,即所说的UV坐标,U是水平轴,V是纵轴,范围在0-1之间。
vn(vertex normal)代表顶点法线
OBJ与FBX格式对比:
3.UV
在模型制作的过程中,有个重要的步骤叫做展UV。简单来说,我们把模型(比如一个人物角色)剪开平铺在一个面上,横轴为U,纵轴为V,范围在0-1之间。我们可以将其视为角色的“皮肤”,展在二维平面上为其绘制,并最终“贴”回到模型上,让其有更丰富的外表细节。这就是UV纹理贴图,可以说,它定义了图片上每个点的信息(比如颜色值),而每个点又跟模型上的每个点是相对应的。
但是展UV绝对是个技术活,展一个正方体盒子当然没什么难度,就如同我们小学美术课把一个立方体剪成六个面一样,当模型复杂起来时展UV也更难。UV展好的话,其表现平整干净,就像是直接从模型上扒下来的纸张,展不好的话,其效果表现就是扒下来的纸张像是叠了好几次,皱巴巴的。展好UV后艺术家们会用photoshop,bodypainter,substance painter等DCC软件(Digital Content Creating )绘制贴图。
当然纹理贴图不止能存储模型的RGB颜色值,还能存储各种各样的信息,后续文章会提到。
材质
我们在一开始画画的时候会发现怎么画都不像,除了物体的形态外,重要的还有光影,因此我们想要让我们的渲染结果更加“真实可信”,我们还需要为其添加具有正确光照模型的材质。而现实世界中,每一样物体又有不同的材质,即会有不同的光照效果,我们先来简单看一下几种光照情况。
1.漫反射(diffuse)
漫反射经典的经验模型是兰伯特模型(Lambert)。红色的为入射光它假设所有的光线被均匀地反射出去,亮部暗部取决于入射光与模型表面法线的夹角,夹角越小越亮,因此夹角为0时为最亮部,夹角为180是为理论上最暗部。
公式如下:
Diffuse = baseColor *LightColor * dot(LightDir , Normal);
baseColor理解为纹理贴图的颜色,lightColor理解为灯光的颜色(比如太阳光一般表示为金黄色之类的),dot点乘结果为(-1,1),但是对于颜色值来说,只要值<=0就是黑色了。
2.镜面反射
镜面反射就是将入射光线根据模型表面法线进行反射,并且只有在反射方向有能量,其他方向能量均为0,因此会根据视方向(即相机观察角度)有不同的表现。
公式为:
Specular = pow(saturate(dot(ReflDir,ViewDir)),smoothness) * LightColor
从公式中可以反射方向与视方向做点乘,夹角越小镜面反射越强烈,而结果配合smoothness做power,表示越光滑的表面高光点越小,越粗糙的表面高光点越分散。
3.折射
不同的介质有不同的折射率,而光从一种介质到另一种介质的时候光的方向会发生变化,比如从空气进入水中,有一部分能量会发射,另一部分能量进入水中后改变了方向。反射和折射能量的多少是由菲涅尔定律决定的。
公式为:
R = refract(View,Normal,ration)
ReflColor = tex2D(skybox,R)
ration是原介质折射率/新介质折射率
4.粗糙镜面反射
可形成磨砂表面质感
5.粗糙镜面折射
可形成磨砂玻璃折射的效果
6.次表面散射(3s效果)
当光照(比如太阳光)照射到我们的皮肤上时(尤其是耳朵手指这些比较“薄”的部位)会出现透红的效果。照在玉石,树叶,水果等物体上也会发生。
孤岛惊魂5和神秘海域4中的皮肤渲染
7.多层材质
一个很好的例子就是木地板打蜡或刷光油,木地板是一层材质上面的光油也是一层材质
参考资料:
1.unity官方文档
https://docs.unity3d.com/2021.2/Documentation/Manual/materials-introduction.html
2.《GPU Gems 3》:真实感皮肤渲染技术总结--毛星云
https://zhuanlan.zhihu.com/p/42433792
3.Unity Shader入门精要–冯乐乐
4.TA百人计划
https://learn.u3d.cn/tutorial/technical-artist-may