- 0
- 0
- 0
分享
- Unity社区精华帖 | Rendering学习:模型与材质
-
2022-05-23
本文首发于 [Unity官方开发者社区],该公众号是 Unity 官方中文社区账户,文末有跳转链接,欢迎大家关注。
想要在游戏里渲染出好看的画面,我们首先要有模型和相应的材质通过 CPU 提交相关信息给 GPU,那么这些模型和材质到底包含了什么东西呢?
模型
点线面
模型实际上就是若干个点按照一定的顺序连成线,线连成面,面连成多边形模型。
模型文件
在 Unity 中我们常用的模型文件有 OBJ 和 FBX,我们来看看文件中包含了什么。
以 OBJ 文件为例:
v(vertex)代表顶点坐标数据,即模型空间中某个顶点的 XYZ 坐标。
vt(vertex Texcoord)代表顶点纹理坐标,即所说的 UV 坐标,U 是水平轴,V 是纵轴,范围在 0-1 之间。
vn(vertex normal)代表顶点法线。
OBJ 与 FBX 格式对比:
UV
在模型制作的过程中,有个重要的步骤叫做展 UV。简单来说,我们把模型(比如一个人物角色)剪开平铺在一个面上,横轴为 U,纵轴为 V,范围在 0-1 之间。我们可以将其视为角色的“皮肤”,展在二维平面上为其绘制,并最终“贴”回到模型上,让其有更丰富的外表细节。
这就是 UV 纹理贴图,可以说,它定义了图片上每个点的信息(比如颜色值),而每个点又跟模型上的每个点是相对应的。
但是展 UV 绝对是个技术活,展一个正方体盒子当然没什么难度,就如同我们小学美术课把一个立方体剪成六个面一样,当模型复杂起来时展 UV 也更难。UV 展好的话,其表现平整干净,就像是直接从模型上扒下来的纸张,展不好的话,其效果表现就是扒下来的纸张像是叠了好几次,皱巴巴的。
展好 UV 后艺术家们会用 photoshop,bodypainter,substance painter 等 DCC 软件(Digital Content Creating )绘制贴图。
当然纹理贴图不止能存储模型的 RGB 颜色值,还能存储各种各样的信息,后续文章会提到。
材质
我们在一开始画画的时候会发现怎么画都不像,除了物体的形态外,重要的还有光影,因此我们想要让我们的渲染结果更加“真实可信”,我们还需要为其添加具有正确光照模型的材质。
而现实世界中,每一样物体又有不同的材质,即会有不同的光照效果,我们先来简单看一下几种光照情况。
漫反射(diffuse)
漫反射经典的经验模型是兰伯特模型(Lambert)。红色的为入射光它假设所有的光线被均匀地反射出去,亮部暗部取决于入射光与模型表面法线的夹角,夹角越小越亮,因此夹角为 0 时为最亮部,夹角为 180 是为理论上最暗部。
Diffuse = baseColor *LightColor * dot(LightDir , Normal);
baseColor 理解为纹理贴图的颜色,lightColor 理解为灯光的颜色(比如太阳光一般表示为金黄色之类的),dot 点乘结果为(-1,1),但是对于颜色值来说,只要值 <=0>
镜面反射
镜面反射就是将入射光线根据模型表面法线进行反射,并且只有在反射方向有能量,其他方向能量均为 0,因此会根据视方向(即相机观察角度)有不同的表现。
公式为:
从公式中可以反射方向与视方向做点乘,夹角越小镜面反射越强烈,而结果配合 smoothness 做 power,表示越光滑的表面高光点越小,越粗糙的表面高光点越分散。
折射
不同的介质有不同的折射率,而光从一种介质到另一种介质的时候光的方向会发生变化,比如从空气进入水中,有一部分能量会发射,另一部分能量进入水中后改变了方向。反射和折射能量的多少是由菲涅尔定律决定的。
ReflColor = tex2D(skybox,R)
ration 是原介质折射率/新介质折射率。
粗糙镜面反射
可形成磨砂表面质感。
粗糙镜面折射
可形成磨砂玻璃折射的效果。
次表面散射(3s 效果)
当光照(比如太阳光)照射到我们的皮肤上时(尤其是耳朵手指这些比较“薄”的部位)会出现透红的效果。照在玉石,树叶,水果等物体上也会发生。
《孤岛惊魂5》和《神秘海域4》中的皮肤渲染:
多层材质
一个很好的例子就是木地板打蜡或刷光油,木地板是一层材质上面的光油也是一层材质。
参考资料:
[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
点击关注 [Unity 官方开发者社区]
精彩技术文章一网打尽~
长按关注
第一时间了解Unity引擎动向,学习最新开发技巧
-
阅读原文
* 文章为作者独立观点,不代表数艺网立场转载须知
- 本文内容由数艺网收录采集自微信公众号Unity官方平台 ,并经数艺网进行了排版优化。转载此文章请在文章开头和结尾标注“作者”、“来源:数艺网” 并附上本页链接: 如您不希望被数艺网所收录,感觉到侵犯到了您的权益,请及时告知数艺网,我们表示诚挚的歉意,并及时处理或删除。