【前言】
之前这里最后简单了解了一些Displacement、Bump、Normal各凹凸贴图的区别。但是感觉还是有点含糊。所以就把它们专门揪出来研究学习一下。(后面要给模型上材质,使模型看起来逼真起来的话,用到的特别多)
X Tesla:【Blender】UV详细解释及各种UV操作zhuanlan.zhihu.com可能有疏漏或不对的地方,还请各位大佬多多指教。
一、为什么要用这些凹凸贴图?
昨天的那些个Modifier用起来是很爽,但是一开始的时候我们是硬给面Loop Cuts,然后给面上材质的。在不断地Array Modifier之后模型面数越来越大,机器渲染越来越卡。(就一个二十多层的楼房就这么多面)后来才知道正当的做法是做精模然后渲染法线贴图给低模以表现出跟高模的类似效果。
这三种凹凸贴图就要派上用场了。正所谓模型不够贴图凑。
- Bump
- Displacement
- Normal
我们做渲染图/渲染视频的时候,不管是ZB刷人物还是Max做家装渲染,是不用去考虑这些东西的,可能说管它多大呢,只要最后老板要的效果能出来就好。
但是游戏可不一样,如果这些高精模(顶点面数特别多,百万级别的那种)都按 每秒60帧去渲染,玩屁咧,难不成玩极限挑战呢,眼睛一闭一睁,画面还是没有动哈,嚎~
要保证画面极致美观(视觉体验),还要保证画面极致流畅(沉浸感)。二者可以得兼,没有舍不舍的概念,因为人类就是这么有创造性。
所以在游戏当中,经常是低模+贴图来模仿类似高模的效果,手机移动平台的话用到的更多。
在贴图上存储更多的模型细节,以降低模型的面数,最终的效果还可跟高模的表现效果媲美。
之前一直是停留在视觉差别认知上,但是归根结底还是要从原理上去认知它们。多问几个为什么,是的,这样可以做出效果,但是为什么会这样呢。
- 牛顿从大自然中发现真理(在某种意义上来说,现实是一种真实游戏,牛顿是这方面的高手,力学光学数学...著作等身)
- 我们普通人从虚拟大自然中去重新认知思考现实世界(打开牛顿的棺材板,好好研究人家的学术)
另外,画家在某种意义上也是一种魔术师,称他们为视觉上的骗子一点也不为过,经常通过光与影的变化用2D来表现3D凹凸效果(私以为这些凹凸贴图跟这种画画技法高度类似)
油画酱的绛:50幅难以置信3D画,看完你会怀疑自己的眼睛zhuanlan.zhihu.com二、相关空间概念
关于这些凹凸贴图的话,我们还需要将一些空间的知识复习一下。
【2.1 】模型空间/局部空间 Object Space/Local Space
类比:自身的视角看世界,上下前后左右(眼睛正视的前面就是前方,脑袋上面就是上方之类的)
枢轴:每个模型都有自身的枢轴点(原点),通常位于模型的重心。
我们在场景当中旋转它们的时候,经常是需要原点位置正确,如下视频设置模型原点位置。
【2.2 】世界空间/全局空间
World Space/Global Space
世界空间可以描述模型的绝对位置(因为有世界原点,笛卡尔坐标系)
不管是游戏引擎还是建模软件都是必须要有的。
【2.3】切线空间
Tangent Space(参见第4节中的法线和两切线的演示视频)
模型上面的顶点verts作为原点+xyz三条轴。
- xy轴是与该顶点相切的两条切线(跟纹理坐标方向相同的切线)
- z轴是该顶点本身的法线方向(N)——Normal
xyz轴向对应——rgb颜色
三、Bump凹凸贴图
中文有隆起物的意思
它绘制的是高度图(Height Map),或者我们叫做它为灰度图,因为它是简单的黑白纹理。每个像素代表表面上的点应该被凸起的数量。(但是并没有实质性地改变模型的顶点面数之类的,注意跟Displacement位移贴图的区别)
我们可以把黑白值当作单个的Float浮点值,0黑1白。
- 像素越白,凸起的数量越多
- 反之越黑,保持不变
下面为Blender当中的测验,这里我们用一个简单的噪波贴图,我们改变光照的角度的话,它的凹凸是没有变化的。
使用Bump贴图前后对比:
Bump Map 感觉跟这篇文章当中涉及到的Cavity 灰度贴图有点类似(不知道这样理解对不对)
X Tesla:【Blender】建模套路——房子【上】(新手必做的完整项目)zhuanlan.zhihu.com四、Normal法线贴图:
【4.1】法线贴图的作用
可以向模型表面添加细节,如凹凸、刮痕、螺钉、划痕等(想象官府大门的凸起圆)
【4.2】Normal 法线贴图的三种空间
- 切线空间(常用这种)Tangent Space(上面第二讲提到过)模型顶点Verts的切线空间
- 模型空间 Object Space
- 世界空间 World Space
模型表面法线;
模型表面切线:
【4.3】法线贴图的影响:
- 法线贴图影响了什么——在平面上计算光照的方式
- 法线贴图没影响了什么——没有影响网格模型的实际多边形性质(Verts顶点Tri三角面之类的数目始终不变)
【4.4】法线贴图的工作原理
- 细节会被表示为纹理,纹理可以调节光从表面反射的方式。它修改了光如何从低多边形平面的表面反射,从而给人以3D凹凸浮雕的假象。
- 我们通常结合法线贴图用较低分辨率的多边形表面来表示较大较精细的模型形状。
- 而法线贴图是用非常高分辨率的源模型生成的。然后将法线贴图映射到低模上。
【4.5】法线贴图是什么
- 法线贴图是映射到模型表面的图像纹理,类似于常规的Base Color/Diffuse纹理
- 每个像素当中的纹素(Texel——1个pixel里面(总共为1024*1024 pixel)的贴图(通常为单个颜色))它表示了表面法线方向上偏离平面多边形的“真实”表面法线的偏差(正常情况下在切线空间中顶点有自身的真实法线,但是我们的法线贴图会变动平面多边形表面的法线朝向(倾斜))
可以在下面如何用Blender来制作法线贴图当中看到。
- 在多边形的每个顶点上面存储了它的真实法线方向,两顶点中间的为插值Interp/Lerp过渡区域内的偏差法线(对应纹素Texel中的颜色),也就是法线方向的真实数据实际上只存储在每个顶点上面(红色箭头),但是多边形平面上的法线朝向会跟随光照的变化(对应纹素)而变化(橙色箭头)。
(如下图中,原先表面可能是一个平滑的圆弧,但是法线偏差之后,出现了小凸起)
【4.6】法线贴图为什么是淡蓝色的
- 每个纹理像素的RGB值表示方向矢量的X、Y、Z值,并作为对多边形表面的基本插值平滑法线的修改而应用
- 法线方向是-1~1的,但是颜色贴图只有0~1的范围,所以需要+1 然后/2 才能将XYZ 变换成贴图对应的RGB值。XYZ(0,0,1)表示垂直“向上”模型表面没有任何变化(参见上方4.5图),+1 /2 之后就是RGB(0.5,0.5,1),淡蓝色。
- 与淡蓝色(0.5,0.5,1)不同的颜色就会导致指向不同方向的矢量(参见上图中底层的方块颜色变化对应的法线变化)
【4.7】划重点
重点知识再回顾一遍。
法线贴图不会影响网格的实际多边形性质,只会影响在平面上计算光照的方式。
在具有大量精细表面细节的大型模型上,需要绘制大量多边形。为了避免这种情况,我们需要学会使用法线贴图来表示精细的表面细节,并使用较低分辨率的多边形表面来表示较大较精细的模型形状。
在开发过程中,我们常常用非常高分辨率的源模型生成法线贴图,然后将法线贴图映射到模型的较低分辨率版本上面,以便法线贴图渲染原始的高分辨率细节。
【4.8】法线贴图使用前后对比:
【4.9】我们如何在Blender当中去制作烘培法线贴图呢(实践是检验真理的唯一标准!)
【4.9.1】简单法线贴图生成测验:
- 创建Plane
- 添加材质
- 在Shading Panel中添加一个image Texture(并确保选中)新建贴图并命名,如Test_Normal
- 在渲染属性下将渲染引擎切换到Cycles
- 在渲染属性Render Properties下面找到Bake栏
- 输出Output Margin外边框设置为0 px
- 将Bake Type设置为Normal
- Influence 保持默认切线空间 RGB对应XYZ
- 点击烘培
- 切换到UV Editing可以看到产生的法线贴图效果。
【4.9.2】法线朝向跟随光照变化
- 创建表面的多边形
- 用Array Modifier和 (Propotional Editing)稍微编辑一下
- 先选中平面Plane再选中表面多边形 烘培(注意不是Shift加选,是Shift框选)
- 连贴图加太阳光可以看变化
- 自己可以多玩玩来测试一下。
五、Displacement位移贴图
【5.1】位移贴图的原理:
用Height Map高度纹理来模拟表面位移(Displacement)
【5.2】位移贴图的作用:
位移贴图(常听到的置换贴图有点勉强),可以让模型表面产生一定的位移变化。(注意跟Bump凹凸贴图的区别,它可以实质性地改变模型的面数,而Bump凹凸贴图并没有实质性地改变模型面数)
【5.3】位移贴图存储的值:
高度图中存储的是强度值(浮点数float)。
- 白色凸起
- 黑色不变
【5.4】Blender当中的Displacement:
注意你的平面要Subdivide 细分(至少30次),否则没有效果呢。
- Cycles引擎下——可以在Shader Editor当中添加位移贴图(记得打开node wrangler插件,Ctrl+Shift+T 可快速导入并自动连线(注意命名要跟蓝图节点保持一致)),并在右边的材质设置里面设置Bump and Displacement或者是 Displacement Only。
- Eevee引擎下(建议用这种,不卡)——可以在Modifier当中添加Displacement Modifier(进入Texture Properties打开选择位移贴图),更改Displacement Modifier的Strength即可。
整体演示过程:
【5.5】Unreal当中的 World Displacement :
World Displacement 要跟World Position Offset区别开:
- World Displacement是根据位移贴图来变化顶点位置
- (常和Vertex Normal WS配合,它输出世界空间的顶点法线(也就是模型上的顶点法线在世界空间当中的位置)
- World Position Offset可以在材质球里面实现模型顶点的一些效果,它是对所有顶点进行操作。常见的如:
- 用Sine函数来使模型的每个顶点产生位移
- 用Rotate About Axis来使模型的每个顶点根据枢轴进行旋转
- 像素乘积来控制大小Scale
这些是直接写在材质球里面的,要做到类似效果,没必要再新建一个蓝图用Construction Script写。
X Tesla:【UE4】特效(一)——制作Spiral粒子特效zhuanlan.zhihu.com六、相关材质贴图素材
【6.1】虚幻自带的/Megascans等:
关于虚幻的材质素材的话,请认准Quixel Megascans,直接在虚幻商城里面免费获取全部资源(包括Quixel官方在油管放的示例视频中的场景素材),人物材质模型都有很多,虚幻之前收购了好多知名软件。
或者是用Quixel Bridge软件下载贴图(素材全,有Epic大财阀撑腰)
【6.2】免费网站:
- https://freepbr.com/
- https://www.cc0textures.com/
- https://3dtextures.me/
- https://texturehaven.com/textures/ (推荐这个)
- 之类的有很多