欢迎光临散文网 会员登陆 & 注册

08

2023-06-23 17:17 作者:绝剑结城  | 我要投稿

自己连了一个卡得不是很通的oldschool+的卡通材质。并且还手写了一遍,一些不懂的地方就是参考的连连看的代码,然后有些自己踩的坑我也标注出来了

然后作业我就不细看了,我想着先主要学新知识把。

时隔多天继续学,我想着第一步先把我的项目管理给搞好,之前虽然说每次新建一个shader都要重命名路径,但最终为了方便,命名和路径还是乱七八糟了(至少个人感觉是这样的)。之前会搞得很乱主要还是因为没理清楚shader的路径原理。Shader自身开头的那个路径,不代表文件路径,而是在shader列表里面的路径(个人目前理解)。因此在管理文件的时候,除了shader文件的路径要管好,shader列表里的路径也要管好(而且这边要更有条理)。

然后庄懂讲到了法线贴图的使用。虽然之前也用过挺多法线贴图,也能明白它的作用,但是其实还挺浅显,也就是知道使用后能把复杂的凹凸信息给加到平面上。这次借着这个机会,我正好深入点学习法线贴图。(不过目前也只是初步地深入学习,后续还会继续往更深的地方了解)

首先,我们需要明确一个观点,物体本身已经有了自己的法线,法线纹理贴图只是伪造一个虚假的法线信息,使模型在计算光照时用上这些虚假的法线信息。

那么我们先从物体本身的法线信息入手。首先对于一个面来说,它的法线很好确定,两条边的叉乘即可。但是如果只有面的法线,在计算光照的时候,每个面之间就会有明显的边缘,因此,我们需要进行平滑法线操作。即计算每个顶点的法线,然后对于面内的点,根据它与三个顶点的距离来进行权重计算以此确定这个一个点的虚假法线(真实法线永远都是它所在面的法线的)。(顶点法线的计算方式也是一个坑,通常来说,对于一个顶点被三个面共享的情况,常见的做法是将该顶点的法线计算为这三个面的法向量之和,并对结果进行归一化。但复杂情况下,还要考虑面积权重等等。)

现在的模型基本都会自带面和顶点法线信息,而即使没有法线信息,unity也可以通过特定算法生成,原理很简单,这里不赘述。但总之,我们了解物体的法线的概念。

法线贴图有两种一种是模型空间下的法线贴图,一种是切线空间下的法线贴图,这两种有什么区别呢?首先我要再重复一遍,法线纹理贴图只是伪造一个虚假的法线信息,使模型在计算光照时用上这些虚假的法线信息。

然后说模型空间的法线贴图。(写到这突然发现我快想把这玩意写成科普而不是笔记了,算了那种基础的东西不写了,比如颜色是啥意思)每个三维模型都有其自己的本地坐标系,该坐标系相对于模型自身而言是固定的。模型空间的原点通常位于模型的几何中心或基准点上。模型空间中的坐标轴定义了模型的方向和尺度。而这个贴图就是对它各个点(不是模型的点,就是指它的表面微分到的最小单位)直接指定了新的法线方向,所以会有各种颜色(因为法线朝向各个方向)

然后是切线空间中法线纹理,首先说说切线空间(Tangent Space),研究了半天,但还是有些模糊的地方。我就不说我认知进阶的过程了,直接说我现在的认知结果。对于一个模型来说,它表面的切向是由纹理映射的u坐标决定的。即切向就是u轴方向。但是有以下几点,1:副切向(在切平面且垂直切向的),不是v轴方向,且v轴方向也不垂直u轴方向。2:这个切向不是切线空间中的切向。那么,切线空间的三个坐标轴要怎么取得?,首先,我们目前拿到一个点(不管是顶点还是面上的),确定了它的法线和它的切向(u轴方向)。那么t轴和b轴就可由下面公式求得其实很好理解,切向不一定和法线正交,所以要正交化,然后正交化后获得了t轴和n轴,那么b轴之间叉乘即可。

我现在的疑问就是,对于一个由几个面共享的顶点,如果它到底以哪个面的u方向为准呢?如果uv是断开的,又怎么算呢?虽然说切向根本上是以下面这个公式来计算,但是也是需要确定好这个顶点属于的面。还是说随便用哪个面算出来的结果都是一样的?不过我现在也不懂怎么验证。不知道以后能不能解决。

计算公式
多个面共享顶点
模型连着uv分开


总之切线空间了解后,它的法线贴图就很好理解了,物体默认的法线在切线空间下统一为(0,0,1),而切线空间的法线贴图也是之间指定了新的法线方向。(为什么通常只有浅蓝,因为默认法线就是浅蓝色,改变的话才会变颜色,但因为通常都是n轴正方向上的,所以都是偏蓝色调的)

关于这两种贴图的优劣和特质,《入门精要》里写得挺清楚,不赘述。

回到庄懂这里,切向空间下的法线贴图的使用,首先用unpacknarmal函数解码法线贴图(主要是解码,区间重映射,要uv可能是因为要确定法线贴图的uv坐标),然后构建TBN矩阵(其实就是切线空间的基,由Tangent切线、Bitangent副切线、Normal法线的方向构成),然后由解码的切线空间法线乘TBN矩阵,就可以得到世界空间下的法线信息,然后那这个法线去搞光照模型。(其实就是基的变换,这里复习一下线代知识:假如有两个基,a基和b基(矩阵形式),有一个向量v,如果我想把b基下的向量v(即vb)转换为a基下的向量v(即va)那么va等于(vb)乘(a基下的b基))

手写注意事项:

默认是bump

随时注意归一化。

参考资料:

https://zhuanlan.zhihu.com/p/412917695

https://zhuanlan.zhihu.com/p/139593847

https://zhuanlan.zhihu.com/p/412555049

总感觉这笔记有点潦草,以后有啥悔悟再补吧。这次其实就是初步深入了解法线贴图。而且其实还不够深入。等以后用到的时候再继续深入。


08的评论 (共 条)

分享到微博请遵守国家法律