学习笔记13

从头来说,

切线空间的生成,首先想象模型上有一个三角形,然后我们现在要得到这个切线空间的三个轴。

首先待会要用到这个三角形的顶点坐标,这个顶点坐标是在什么坐标系下的,这一点是需要注意的,如果是世界空间下的,那么也就是说整个模型现在是相对于世界空间而言的。那么我们求出来的TBN坐标系,也就是三个轴向量,也是相对于世界坐标系的。

说完了准备条件,首先我们在三角形上建立一个TBN坐标轴,怎么建立,三角形首先会对应UV中的一个部分,然后UV平铺开和三角形共面,UV上的三角形位置和模型三角形做一个重合。这样UV轴就是TB轴,然后根据面的法线,我们可以建立N轴。所以TBN建立完毕。

下面就开始解出来这些轴。首先上边红框的内容,e0和e1是世界空间的东西,而Δu0是UV空间的东西,而UV空间的表示是和TBN空间一样的,把N认为是0即可。这句先不考虑N轴的情况。

其实这句成立等号的原因是:这是一个变换。

首先上边网格是一个基坐标系。

然后在这坐标系中产生了以b1b2为轴的坐标系。 然后有一个向量,黄色的那个,它在b1b2为轴的坐标系中的表示是:(-1,2)。

然后我们想要获得他在基坐标系下的表示,这个很简单,就如上边一个变换方式,就是  -1 * b1 , 2 * b2即可得到,然后把这个相乘的形式,可以写成左边矩阵的形式。

从这里面,我们可以不同的理解这两个形式。相乘的形式,我们可以看作,每一个轴上的量,分别去乘以一个东西(这里的b1,b2),然后分别得到结果,他们组合起来就是最终的结果。

意思也就是每一个轴分别进行变换得到,然后组合,得到最终的变换结果。

而矩阵的形式,就是直接通过一个矩阵,对这几个轴同时进行变换,得到最终的变换结果。

回到红色框里面的内容,我们就是用TB坐标系下的值,去乘以TB轴(说的更具体一些是TB轴在世界空间中的值),然后得到的就是世界空间坐标系下的值。

然后我们可以把这个式子写成矩阵变换的样式,便于我们进行接下来的恒等变换。

再往下的内容,就如文章所写的了,就是一些等式变换的trick,得到TB矩阵的表达。

由于N我们本身就知道的,所以TBN三个轴就知道了。

——————————————————————————————————————————————————————————————————

Rendering1

这里关于rendermode设置为not important的时候,首先天上的太阳不见了,这是正常的,因为当前的平行光不再作为方向光了。

但是疑问的点在于:灯无法照亮物体了,就像灯失效了一样。

现在灯光mixed,烘焙模式是subtractive。

地板静态物体,直接光是烘焙的,场景没有间接光。也就是上边白色直接光。

这个模式下(subtractive),球是动态物体,接受直接光照是实时的,特意强调了他的阴影也是实时的投射到静态物体上。

而我们这里控制的属性颜色,就是控制这个实时投射到静态物体上的阴影的颜色。

为什么说上边特意强调,静态物体。

如果投射到动态物体上,他的颜色还是之前默认的阴影颜色,不是我们调节的颜色。

重复一遍,subtractive针对静态物体,直接和间接都是烘焙的,动态物体,直接光是实时的,间接光是烘焙的。

这里就是越来越低级,第一个是天空球啥颜色,环境光各个方向就和天空球一样的颜色,如果是第二个,那就horizon,ground sky指定三种颜色,然后会有一个平滑的过渡,据此得到不同方向的环境光。

color就更低级了,各个方向的环境光都是一样的颜色。

只要场景中有天空盒,那么就会自动帮我们生成反射探针。这个反射探针就是再lighting environment中控制的反射探针。

这里说的环境光探针,因为上边我们说环境光的时候,他是有三种方式的,一个天空球,另外俩其实本质也是天空球,只是颜色上有变化罢了。

而计算环境光,其实也是对天空球采样,那就和反射操作类似了,也可以理解为一个探针先去对天空球进行一个保存,保存到贴图中,然后对贴图进行一个采样;

首先任何物体多多少少都会对周围物体有一个反射的。默认情况下,为了模拟这个现象,unity默认给物体生成一个反射探针,这个探针捕捉的内容是天空盒的内容。

然后再说反射探针和反射现象的模拟之间的关系,其实之前写shader的时候已经知道了,反射现象的模拟就是对已经生成好的反射贴图进行一个采样。那么反射贴图是哪里来的,这里就是反射探针生成的。

反射探针的内容既然是只有天空球的,那么物体默认情况下的反射内容都是天空球了。

但是这个显然不合理,一个室内的物体,反射的图像居然是一个天空球,为了解决这个不合理的现象,unity提供给我们一种方式,就是可以手动往场景里面添加反射探针。

这个反射探针添加进去之后,他会对反射探针当前位置360度进行采样生成一个贴图,这个就是包含探针周围所有物体构成的环境的一张图。

然后探针有一个范围,范围内的所有物体在进行反射的时候,都不再采用默认的那个只包含了天空球的反射贴图。而是采用这个新加的探针生成的反射贴图。

这个贴图如实的记录了探针周围所有物体的信息。如果说物体和探针的位置非常接近的话,探针周围信息,就是物体周围信息,然后这样采样贴图,基本上得到的就是物体周围的环境经过物体反射后的结果。

探针的技术就是这样,这里有一个问题,就是总不能所有物体都和探针位置都非常接近吧,针对这一点,unity提供了一个选项:

这个就是随着物体在探针范围内具体位置的变化而对反射贴图的采样进行一些调整。这样得到的结果就是:即使物体和探针不是非常接近的,物体反射的环境信息,看上去也是类似真实反射情况下的样子。

通常情况下,反射探针的类型会设定为烘焙,实时性能消耗会很高。

当然烘焙的话,也还是只对静态物体进行一个烘焙。

理解了反射探针的概念之后,这些概念就很简单了,就是对于那张默认生成的反射贴图的相关设置。

之前我们说那个贴图是只考虑天空球的,这里我们可以进行一个设置,可以让它考虑我们自定义的一张贴图。

然后就是贴图的一些分辨率和是否压缩的信息。

还有就是关于这个反射的强度是如何的,基本上就是用来控制反射的亮度。

最后一个是弹射次数,就是考虑一个物体反射出去之后,光线又射到另外的物体再次进行反射的情况。当然这个默认值是1,也就是只考虑一次反射的情况,这个考虑太多,就像光追一样了,性能消耗肯定很大。

什么是Halo:

首先这里光源本身都有一个自带的halo,如下Draw Halo按钮是控制halo是否打开的。

然后我们environment面板中控制的参数包括texture和strength都是他的。

我们看上图,这里还有一个红色的Halo,其实这个是对灯又添加了一个组件,这和灯本身就没关系了,和我们environment面板中的参数也没关系了,是一个单独的组件添加进来,其他的普通mesh也是可以添加这个组件的,但是想要有上边这种glowing的效果,物体需要会发光才行。

在组件中有他的相关参数可以进行调节。

另外补充一点,这里看效果的时候是和雾是类似的,距离拉的太近了可能就直接看不到效果,拉远了才可以看到效果。

文档上,还提到了一点,就是如果我们对他这个glowing效果的shader不满意,我们可以自己写,写完之后把这里修改成我们自己的shader即可。

首先什么是lens flare 效果:

这个和上个halo类似,这个也是灯光自己带了一个,然后组件中可以新添加。

对于environment面板中控制的也自然是自带的那个,这里他们都需要一个flare asset拽过来才会有效果,这个flare asset主要就是决定这个效果是什么形式的,上边我们把俩效果放在了一起,如果分开展示:

其实这里是有问题,问题就是,scene视图下是有这个效果的,但是我们一旦运行就没有效果了。

具体原因:

(117条消息) Unity LensFlares(镜头炫光)踩坑以及解决总结_梧桐上的小鸟的博客-CSDN博客_lensflares

上边文章说了是需要开启摄像机的后处理,但是我使用的是内置管线,上边文章使用的是URP。

而他的管线是自带后处理效果的,我的则需要自己安装。

在Window-package Manager中打开下面的页面,然后在左上角unity registry中,右边再进行搜索即可。(补充一句,如果是unity官方的实例导入的时候,也在这里,是左上角换成My Assets,然后导入的。)

导入之后还需要添加:

(117条消息) Unity Post Processing(后处理效果)添加方法及注意事项-最全最新_嘿皮土豆的博客-CSDN博客_unity后处理怎么加

这里添加就类似新加后处理效果了,反正没有搞明白这一点,最终也没有在Game视图下显示出来。

而且如果需要新添加后处理效果,这里也没有flare。回头再说。

碰到了一个挺有趣的效果:

(117条消息) 【LensFlare镜头光晕】Unity3D奇葩实现_雨落風輕的博客-CSDN博客_unity镜头光晕

---------------------

上边我们算是对于environment面板内的参数有了一个基本的认识。

这里原作者提到这个面板的原因是:这个面板里面有两项东西,一个是ambient,一个是reflection,首先这俩它都会给我们的物体多多少少加一些颜色。

加的方式,复习一下,前者是通过采样天空球,还提到一个环境(光)探针的东西。reflection更是这样,也是利用一个默认的反射探针来实现的,这个反射探针生成的贴图里面只有天空球的信息。

所以为了让这些东西不影响我们的效果,我们应该给他关了,因为shader做出来该啥样啥样,如果不关掉这俩,那么shader实际结果加上这俩才是你看到的,也就是你看到的不只是shader,那怎么会利于你调效果呢?

关闭的方式之前说过:

这里采用最简单的方式,他们都是和天空球相关的,直接把天空球删掉,改成none即可。

我们删除之后,上边的ambient没有天空球就会直接用这个ambient Color,其实并不是纯黑色,而是有一些蓝色在里面,而reflection 那个就纯黑色了,warning box said。

关于为什么要有subShader

这一句的意思应该是:我们的shader一般想要看看在目标平台上能否可行,需要build,为啥,因为shader你保存后的编译只是上边所说的面板中的编译的一种情况,而在build的时候是可能多平台的,而你的程序也可能想要测试的就是多平台。

这时候你需要进行build,但是build他就慢了,所以你可以在这里进行一个多次编译,只需要切换平台即可。

这一路下来都在看这个编译后的东西。

这里是通过输出参数进行返回的,这样待会也会正常插值进入fragment。

这里一个球的local 坐标是+-0.5

上边蓝色的意思是:这个参数是纹理参数,最后没有写{},而它下面一个参数就直接是一个非纹理参数,这时候会出错。.

 

0

首先整个纹理本身是一个正方形,现在被wrap上去,投影上去之后,顶部其实是有挤压的,越靠顶部挤压越严重,这么一挤压,他就不再是线性的了,也就是UV之间的变化就不是线性的了,但是插值依旧是线性插值,所以对于一些边界,必然会有一些前前后后的误差,最终就导致上边弯曲的样子。

unity可以左上角Asset,然后import asset来导入资产,也可以直接拽,如果我们直接拽,那就没有导入相关的属性设置窗口,这时候会直接使用默认的那一套。

这里的意思应该就是:这里可以假设一种情况,就是一个正方形纹理,和一个正方形网格mesh(由多个三角形构成)。

现在要把纹理贴到mesh上,并且采用双线性插值,这里考虑正方形网格距离摄像机比较远,所以像素比较大,需要插值。

首先思考一个角,mesh的一个角,在UV上他应该对应纹理的一个角,现在有一个像素,我们假设他距离这个角非常近,所以它插值之后的UV坐标,也是在角附近的,在边缘上的。

那么下一步在这个像素进行纹理采样的时候,由于采用双线性插值,他需要采样到四个纹理元素,因为它本身的位置是在边界上的,那么就很有可能导致这采样的四个纹素坐标会有超出边界范围的。

repeat模式下,那么采样的结果就会使正常的边界信息,混合上对边的一些颜色信息。也就是上边说的如果两个边界是类似的纹理颜色,那么没啥问题,如果不是similar,那么你就会看到结果回事采样了当前边界的颜色之外,对边的颜色也渗透在里面。

一个从黑到白的纹理,我们在白色那边缘采样最后得到的颜色不是纯白的,而是混合了黑色的。

这里首先,如果像素小,纹素被放大了,那么我们直接采用双线性插值,这是完全没问题的,只要是像素小了,不论小到什么程度,因为这里的采样方法是采用的插值,是合理的。

但是这种方法针对像素大的情况就不合理了,假设像素的中心就落在一个纹素A中心,那么插值结果就会是只考虑A纹素的颜色,这是完全不合理的,一同插值的另外三个也应当被考虑,毕竟他们都在这个像素中的呀。而且还有问题是啥呢?像素大和像素非常大的时候这种方法效果是不一样的,非常大,一个像素对应十几个纹素,但是他只是插值周围四个,这也是不合理的。

所以这种方法就不行了,问题就在于相邻的像素,他们最终的采样结果之间会漏掉一些纹素(如高亮字所表达的,他们采样的像素之间的距离超过了1个像素,也就是中间有没有被采到的)

这自然也就会带来如上所说的生硬的过渡,生硬了那就sharp了。

这里的滑杆表示的值首先是什么,这个要搞明白,他也是一个个整数的,而且我们的图片mipmap层级从0到9,他这里也一共是个层级,所以他基本上就是mipmap的层级,确实是这样。

然后他的滑杆是一个范围,这里的功能是进行一个灰色过渡,只有在这个范围内的mipmap层级才会参与这个灰色过渡。

然后他这个越靠右边mipmap层级越高。其实我们才场景中一般看到的mipmap层级不会很高。

然后这里从左到右mipmap层级越来越高,混合范围内,本身颜色和灰色进行一个混合的程度越来高,也就是灰色的比重越来越大。

所以上边说的那句range across which,其实是一个介词加which的定从,然后后面说把这个过渡搞成单独的一小步,意思也就是把fade range的范围搞成1,假设本来范围是三,那么基本上就分为三层过渡,一个稍微灰一些,一个和灰色混合较深,一个直接变成纯灰色。

那么这里范围是1,其实也就是只保留了纯灰色这一级,也就是上边所说的sharp transition,突然变成灰色的了,能不sharp么。

然后后面一句越靠右,过渡越晚,是指的发生过渡的mip层级更大更晚。

这里第一个后面有讲,以后再说。

第二个说的是雾,因为这个远处的东西他不一定就mip层级就高,也许他本身的贴图分辨率就低呢,距离远的时候正好one to one。

而雾是和距离挂钩的,这里的距离和mip层级没有直接的关联。所以不能应用于雾相关效果。

没有mipmap的时候,三线性插值和双线性插值是一样的效果(入门精要144页),效果都是什么呢?都是漏掉了像素,而且漏掉的越来越多,那么自然也就是sharp,too sharp。

带有mipmp的时候,他应该说的是边界处的sharp,要不然随着mipmap level的增高,怎么可能会变blurry呢?

如果解释成边界处sharp,多少有些奇怪,反正知道下面是引入三线性插值的就行了,对于有mipmap的纹理而言,三线性插值就是在双线性插值的基础上,注意是基础上,也就是他首先会选择对应的level去进行双线性插值,然后再进行level之间的额插值。

首先这里各向异性去掉之后变得模糊,主要是因为,没有各向异性,对于像素投射到纹素上的形状,我们一般会采用最长的那个边,这样无疑是让很多的像素位置选择的mip level变得更大了,那么自然也就变得模糊了。如果采用了各向异性过滤,那么针对一些长方形的就可以直接用其对应的个性一下的mipmap,会相对清晰一些。

这里是因为他是双线性插值了,所以变得sharp了,其实这里和之前没有开启各向异性的时候进行对比,还有一个区别就是在于,

在于边缘处,也就是那些纹素被压缩的一些地方,有了各向异性过滤之后,他就不再需要用最长边去匹配一个更高级的level了,单纯使用当前level的各向异性对应的mipmap即可。

这里其实就是关于项目设置中的各向异性设置和纹理图的各向异性设置之间如何决策得到最终的各向异性设置。

当项目中关了,那就一定关了,不管纹理如何设置的。

当项目中说让纹理决定,那么最终就按纹理设置的。

当项目中是强制打开,纹理那边是可以关闭的,但是纹理打开了,他的level设置就必须再9以上。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值