2023-7-26-Ben-Cloward材质原理教学

这个系列有50多集,讲的东西比较深入。

2节电脑是如何呈现材质结果的。从cpu开始,3d软件(maya,unreal engine)将顶点数据通过direct x或opengl传递给显卡驱动程序,驱动将数据传递给显卡前端,它的作用是和cpu交互。顶点数据被发送到顶点处理器,顶点数据由物体空间中的顶点位置、UV坐标、顶点颜色、法线构成。顶点处理器主要的作用是将顶点位置由对象空间转化为屏幕投影空间。

​​​​​

顶点数据经过顶点处理器处理后由像素处理器生成像素,这里涉及栅格化和插值,打个比方来说就是illustrator的矢量文件导入到photoshop中,在ps中键入文字右键这个图层可以看到一个“栅格化”选项,就是把矢量信息栅格化。顶点处理器对性能的依赖远小于像素处理器,因此出于性能考虑尽量在顶点处理器中完成。

在ue中演示,使用VertexInterpolator,左边的运算都会发生在顶点处理器,而右边的发生在像素处理器,因此下面这个案例中从原先的152条指令缩减为148条。注意time可以和2维、3维数据计算,所以演示中的球体只在u方向移动纹理,只在z方向周期性“弹跳”。

34节没什么深入的东西跳过,5节讲纹理贴图,纹理贴图从制作到引擎的过程。对于纹理的调整最好是在ps,sp、sd这些软件中都搞好,而不是在unreal engine中修改(作者建议)。

关于纹理的尺寸,无论在ps中做出来多少,放到引擎中都按照下面这个表来计算占用内存的大小。列代表压缩格式,行代表图片像素,2048、4096就是我们常说的2k、4k像素。4通道贴图(加入alpha后)会比3通道大一倍。

在unreal engine中设置压缩格式,对于单通道的比如粗糙度、高光、ao勾选Masks(no sRGB)。

6节中提到了mipmap的加载,游戏启动时低分辨率先加载摄像机看到的先加载,lerp相关没什么深入的除了配合desaturation,负值可以加强饱和度,之前的教学说到lerp的alpha只能0-1之间否则会出错,看来也是众说纷纭有许多特例可能,不过这个饱和度调节没啥必要吧?

7节点积(dot product)的妙用。在UE5-材质宝典中提到过点积是向量之间的乘法运算,用来判断两个向量是垂直或平行。在Ben的教学中首先提到了点法线与摄像机方向向量的点积所得到的这种球形渐进遮罩效果,我想起来这个效果和UE5-材质宝典中提到的Fresnel节点几乎如出一辙,关于这里CameraPosition-AbosulteWorldPosition,暂时不清楚其含义也不知道后面加个Normalize是什么意思。这节后面解说Fresnel的原理就是这个。

如图所示的这个rgb数值可以通过点积运算使base color转为灰度模式。

对packed channel可以用点积运算去选择不同的通道。

第8节,Multiply对texCoord可以操控平铺数,也就是UVtiling的次数。

mask rgb 可以拆分rgb通道也可以拆分uv,r代表u、g代表v,这样可以单独控制u和v,texcoord控制uv的tiling,越大则平铺重复越多,小于1则为放大贴图,append可以将拆分的通道再合并起来。Ben把纹理坐标和Uv坐标视为同一个东西,并没有详细分析计算的含义,只是从输出的图像去归纳运算的效果。

9节输入向量(Input Vector),在计算机图形学中,我们使用向量来找出关于场景的重要信息,比如物体离相机有多远或者表面面像什么方向,物体是否应该被光源照亮。表面法线或者通常称为法线,是储存在模型每个顶点的向量。每个点都有自己的法线,这里没有展开说点法线和物体法线的关系,法线的单位皆为1,这有助于点积运算。

摄像机向量有时也被称为视图向量或眼向量。我们可以测量摄像机向量来查看一个点距离摄像机有多远。前文演示过将摄像机向量单位化与表面向量计算点积来判断垂直或平行。

用沿着z轴的方向向量与物体的表面向量做点积,结果如图,朝z方向的最亮逐渐到垂直方向完全变黑,反方向的也是黑。

之前的章节展示过CameraPosition-AbosulteWorldPosition然后Normalize与VertexNormalWS做点积,这一节表明Camera Vector等于那一串东西。

CameraPosition-AbosulteWorldPosition为摄像机位置减去物体在世界空间坐标的向量(显而易见两个都是3维的位置信息相减即一个3维向量),VectorLength测算出其长度,下面这个案例中减500意味着当物体离摄像机距离小于500则结果为负值,连入base color即黑,超过500则为白,这里除以5000则使得在超过500后到1的纯白需要5000的长度,比如4800的长度则(4800-500)/5000=0.86,1维数据连接高维插槽会自动升级赋值相同的数据。

10节视图、世界、物体、切线空间,这一节的内容需要较深的数学能力,有大量的线性代数和矩阵乘法。所有空间都是由一个原点和三个方向组成。

世界空间(World Space)是恒定的,不受摄像机、物体的操作而变化。物体、视图(摄像机camera space)空间会跟随物体的操作变化。切线空间不是太清楚,从图示上来看说的是物体上每个点与其法线垂直的平面构成的空间?

两个向量要运算必须在同一空间中,也就是在UE5-材质宝典里提到的TransformVector节点,用来变换空间。

案例1,将世界空间转换为摄像机空间,这样无论如何观察,都可以在正对的方向看我们所需的Texture Sample。转换后连入base color可以观察到随着视图移动,物体的着色恒定不变,但直接这样连接texture sample发现效果不太对劲。这里设定了一串乘法和加法用来对uv做修正?目前不清楚这么操作的依据是什么,我觉得要想做好建筑装饰势必要对这种数学计算和图像的映射关系了如指掌才行。而不是现在看到一串操作,把它当成一个现成的工具。

用我自己的理解制作黑白遮罩上层苔藓下层岩石的效果,教学中采用的是转换切线空间为世界空间,我不理解这里面的逻辑。

不用mask依旧可以用点积的逻辑来遮罩,这样看来任意texture sample连接TransformVector都可以提取空间做点积运算,这里转换为了本地空间,使物体自身上的z轴上半部分下半部分遮罩。

11节,4个用来限定范围的节点,min(上限)、max(下限)、clamp、saturate。

没有使用saturate这里的lerp会出问题,显示被加深的颜色。

12节混合法线贴图,在法线贴图中经常看到大片的淡蓝紫色,它的方向向量(0.5,0.5,1)代表平坦部分,暂时不理解这个数值的含义。法线贴图中的颜色实为方向向量,告诉材质每个像素指向哪个方向。

接下来介绍5种混合法线贴图的方法:

第一种混合方法会丢失一些底层的细节,但其内存使用较小,用于不需要很精确的地方。我不明白这里的红绿向量相加意味着什么,在蓝色通道被丢弃用1替换后,为什么还有凹凸?另外向量相加结果大于1的话又怎么说呢?更进一步flatten normal通过负值加强法线凹凸效果的原理是什么?下面这篇似乎有深入讲解。

法线混合的原理解析

UDN法混合,这里将基础法线的蓝色通道append到红绿法线相加后的结果,再单位标准化。

whiteout法混合,将蓝色通道相乘后细节的法线信息也丰富了,我不明白这个相乘是什么意思。RNM法混合,前面的相加、相乘也看不懂这个就更别说了,这节不去啃原理文章的话就是生搬硬套一下这些操作用来混合法线。不知道啃原理对设计、布局会不会有启示意义。

ue自带了BlendAngleCorrectNormals可以用来混合法线信息,这里使用的算法就是RNM法混合。

13节对一个材质混合细节,作者做了一个四通道的纹理贴图,RG通道分别为xy方向的法线信息,B通道为粗糙度,alpha通道为颜色叠加。这里提到贴图本身不是法线贴图,作为packed channel不能选normal的压缩格式,由于没有颜色信息因此srgb也不勾选。rgb通道出来的值是(-1,1),要转换到法线的范围(0,1),然后通过DeriveNormalZ将RG通道的法线转换为XYZ法线(完全不懂里面的逻辑)。粗糙度是通过相乘,这个可以理解,也就是加深,越黑越粗糙,颜色叠加这里用的是Blend_Overlay而不是相乘(这个函数里面核心也是相乘,不过逻辑上有些复杂)。

14节如何通过遮罩在物体不同的位置添加纹理细节,首先示范了一种错误的做法,这个方法需要暴露所有的纹理占用内存大。作者说应该使用textureArray来处理这种情景的需求。注意法线信息的叠加乘法和加法的使用,目前还是不清楚其原理。

TextureArray的使用,用TexCoord 与纹理数组下标append来选取所使用的纹理。

这里我能理解texture sample里的4个分区变成了0,1,2,3,不过自己肯定是想不出来这种遮罩方式的,目前思维限制在比如下面这个情景需要uvw,现在有了uv那我想的是再给一个一维数值,想不到append还能连入类似lerp 的alpha。显然这里的texture sample的r通道是一维数据,但思维上目前跨不出来。

15节smoothstep节点的使用,它决定了梯度在哪里发生。

之前的z轴遮罩只能对半开,现在可以控制其高度比例。

在unity中利用梯度的偏差相减制造边缘

16节length、distance,ue中用VectorLength节点测量两个点(向量)间的长度。这个长度和distance节点计算结果是一样的。

下面这个案例中对本地空间测z轴距离,从而构成黑白梯度遮罩,从结果来看和smoothstep类似,由于黑色部分为0相乘为0,所以从白到黑周期摆动的幅度不同。

第3个例子通过time实时计算距离压缩至0-1来呈现黑白y轴变化移动,目前不清楚这个LocalPosition是什么概念,它的位置物体的pivot中心然后向量为世界空间中的坐标吗?我试了下将物体的世界坐标向量与自己测距,照理是0可显示依旧为白说明不为零。

17节讲了,round(四舍五入)、ceiling(取上界)、floor(取下界)。

18节DDX表达式公开DDX导数计算,这是像素着色器计算中使用的一项GPU硬件功能。这么说完全不懂干啥的。在实际案例中,展现了利用ddx、ddy求面法线?这一节内容如同天书跳过吧。

19节sine cos。示范在unity展示了波纹效果,这个设计十分巧妙用一个白色圆形渐进的黑底图与frac-time相加这样可以周期性的使白色部分从最亮的中心部分扩张到原图效果,再利用乘法加强对比度之后利用sine的周期性即可得到波纹效果。注意sine在unreal engine中的周期是1,0-1完成一次周期,其中0-0.5为正值0.5-1为负值因此就有了间隔相等的黑白环,这里的clamp能控制波纹环的数量原理是大于max的值被压成了max,而所有正整数取sine皆为0因此为黑也就是初始最亮的那部分在扩张的过程中被变成了黑色,知道在min-max范围内的比如说在2-2.5,3-3.5这部分变成了白环,四角的黑色被压成min,正整数取sine为0.

尽管解读了原理,但不由得感叹这是人能想出来的吗?

rotator节点可以旋转uv。旋转uv的数学原理十分复杂。

20节power节点用于对比度控制。

21节,看shader graph指令数来判断性能优化并不可靠。作者演示了电脑如何将shader graph的结果输出,其中hlsl代码通过不同计算机显卡的转换所使用的指令数量、类型是不同的。

22节讲了建立一个专门测试材质性能的工程,然后用专门的软件测算其渲染时间,我感觉没啥用,知道问题了又怎么样,又不知道怎么改。

23节高级通道打包,为什么要通道打包还需要补一下相关的知识。这节示范把3个纹理进一步合并到两个,往往很多物体不需要金属度贴图、高度贴图、透明度贴图,而法线贴图的rgb,其中蓝色通道可以根据勾股定理计算出来,所以也不用,这样的话3个纹理只有7个通道使用,所以可以进一步压缩到2个纹理中。需要注意的是法线的这种转化方式会影响质量,它不适用于角色、硬表面道具,适用于地形、植被、石头等不太关注细节的物体。

24节反射与折射(reflection&refraction),所谓反射在unreal engine中指的是摄像机的方向向量与物体的表面法线的镜像方向向量,折射的方向向量表示摄像机向量穿过物体表面发生的弯折。

利用cubemap,制造自定义的反射而不是通过真实环境的反射。

折射的使用。orgin表示从什么介质射入,target表示发生折射的介质。

最后介绍fresnel节点产生的边缘白,中心黑的遮罩模拟了现实世界中,边缘反射中心折射的现象(关于这个物理现象我暂时没概念)。如何使用fresnel节点结合自定义的反射、折射。

25节通道控制,mask component可以拆分通道,append合并,swizzle交换(用于旋转uv),appendmany交换。

26节位置信息,之前令人疑惑的这个四色球,world position是指物体上每个点的位置信息,所以我们看到右上前是红1+绿1+蓝1为白,右下前是红1+绿1+蓝0为黄(rgb和物体位置xyz的对应关系)!而object position为红色,意思是视整个物体为一个点因此,其颜色为单色。

物体本地空间,他不会随着物体的移动而变化,是物体上各个点相对自身的空间。

world position指的是物体每个点在世界中的位置,因此我们看到随着移动,物体部分逐渐变色。

object position则是将物体本身视为一个点,随着物体移动,物体整个变色。

将纹理赋予世界xy平面通过z轴投射到物体上。

27节世界方向遮罩,其中点积后相除这步不明白是什么意思。如果说绿色除白色可以理解为红0,蓝0除以1还是0所以为绿色,那么黑色除以黑色呢?最后用乘法叠加颜色,黑色部分为黑白色部分就是texture sample的图案了。

28节世界空间三个平面的投射,弄明白了这里用lerp的原理,当我有了第一个面的投射后,将第二个面的投射一并lerp,根据a0b1的原理,把第二个面的投射方向作为alpha连入,这样就把第二个面作为b(白)添加进来了,同理添加第三个平面。

29节将这个投射材质的计算过程打包成材质函数,把贴图、平铺次数、边界的强度这3个参数暴露出来。

30节(异常复杂警告)3个世界空间平面的法线信息投射,这里面涉及切线空间和世界空间的转换,法线在unreal engine中是投射在切线空间中的。太复杂了暂时跳过。

31节matcap视图空间材质,这里搞明白了之前的x0.5+0.5操作,实际上就是基本的平铺次数和贴图平移,只不过到了球面上就困惑了,还是没有对概念清晰认识。教学里采用了另一套方法,涉及到了叉积,关于向量运算我想看看下面这个系列教学会不会有帮助。

Unreal Engine Tutorial Vectors

2023-7-28-UE5-材质宝典-初学者材质基础入门系列 2023-7-19-procedural-building-generator使用总结1

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×