TA-Shader-文件 shaderforge自学笔记 - 数学计算
发布于
2018-8-14
10211
25
TA资源类型
TA资源类型: 算法思路 其它 
shader资源类型: Shaderforge节点 
适用引擎: 其它 
资源介绍: -

您需要 登录 才可以下载或查看,没有账号?注册

x
看了网站上好多帖子,觉得都特别棒,于是萌生了用论坛帖子做学习笔记的想法,希望各位也能从中得到一些收获!
我的会把每一个节点对数据的处理,做成数学公式,方便更深入的理解每一个节点是如何在显卡内实现,然后剖析代码,以便于能够更好的服务于项目,做优化!吐槽一下,没有办法做编辑排版好难受!不过这些都不重要
首先第一仗,从arithmetic这个模块
1、arithmetic模块
1.1理解一个概念,就是数据运算的方法
正常的数学计算是:a暗箱b =c
shader的计算也是这样,不过是多了一个需要注意点,就是:a暗箱b = c运算的是对应像素的结果,可以把图片理解成一个数组,每个像素都是ID号
理解了算法是对应像素来计算的,那接下来的计算就好理解多了。其实懂了这点以后,下面的就是知识储备量的问题,不是特别重要了,可以当成笔记来查阅。
1.2解释arithmetic模块的算法
1.2.1基本算法

Add                 a+b                例子:a=3  b=5   a+b=8
Subtract           a-b                 例子:a=3  b=5   a-b=-2
Multiply           a*b                 例子:a=3  b=5   a*b=15

Multiply Matrix     这个我怕我解释明白,所以我放一个3D数学的链接,你们看一下大概就懂了。大概讲一下我的理解,就是构建矩阵,但是一般构建的都是单位矩阵,除非你特别了解
                             下面附上链接:https://www.bilibili.com/video/av49151459?from=search&seid=15718596688936348249

Divide              a/b                 例子:a=3  b=5   a/b=0.6
Reciprocal      1/input             例子:input=0.25   1/0.25=4
Sqrt                  开方               例子:input=9     9开方=3

log                    对数              这个没有例子,讲一下用法,就是输入的越大,返回值越急促。一般用来处理阴影的缓急或者图片消失边缘锐化,溶解的边缘,还可以拉高图片的对比度,当然输出值变大变小和缓急程度取决于,log下的选项自己可以做测试,目前的测试结果为Natural为缓,Base 2为中等,Base 10为急。但是图片的信息一般为0-1看不出来变化,可以把图片信息用一个乘法变大,然后用log输出,这样对比度就拉开了,当然你还有更好的选择就是power,但是每个节点算法决定了图片的变化,在可接受范围内选择节点。
186805b73b71d6240c.png
节点对图片操作图
538505b73bb698ed15.png

Min    取AB输入的较小值,可以用来处理处你想要的图片效果,可以增加效果,也可以减少细节。详细解释一下,如果你觉得你的图片可能需要一些数值,在最小的部分填充一些,你可以 用这个min多次增加,这样就能增加一些细节,但是会成梯度增加,至于         减少,就是把小于这个数值的细节清除掉。用这个想法来统一理解max即可。
Max   取AB输入的较大值,可以用来处理处你想要的图片效果,可以增加效果,也可以减少细节
       两个图片输入的时候,取图片上对应UV的信息,两个节点结合使用就是想图片上一些数值进行调整,对应到图片上就是RGB,你也可以对单通道进行处理,然后把通道混合,这个方法可以用于你自己创建阴影,改变阴影过渡等等,当然改变阴影过渡的方法还有很多,比如sign,ceil,roundd等等,这些都是对数据进行的处理power   跟log很像,但是也是有区别的。
            计算是:源数据输入^exp输入。这个曲线的特点:
                       1、大于1的数会越来越大,值越大变化也越快,
                       2、小于1大于0的数会越来越趋近于0,值越大变化会越来越缓,
                       3、1不会变
                       4、大于-1小于0,exp为基数为负,偶数为正,数值越大,越趋近于0,越平缓
                       5、小于-1,exp为基数为负,偶数为正,数值越大,越趋急促
               图像图像里,一般是对图片的处理,根据特点是0-1,这样就可以拉开对比度,但是也取决于EXP的输入值,建议不要输入小于1的值
Abs         绝对值
Sign        把大于等于0的数值统一规划成1,小于0的数值统一规划成-1
Ceil         把0-1的数值统一规划成1,大于1小于2的数值,统一规划成2,依次类推
Round     把Ceil取的范围在X轴向上,向左平移了0.5个数值
Floor       把Ceil取的范围在X轴向上,向右平移了1个数值
Trunc      -1到1统一变成0,然后负数是Ceil,正数是Floor
Fmod      商余    这个节点用处比较大,主要处理周期性的波动,具体算法为输入A节点/输入B节点,商为整数,余下的数就是输出,比如9/2  =  4   余1,输出就为1,这样就可以限定循环周期,输入B值即为循环周期,然后从0到(输入值B-1),周期循环。也可以把图片分阶层,非常实用的一个数学算法。代码写法为:Fmod(A,B),如果B=1,则是frac
Frac         把所有的数值规定到0-1,类似于周期循环为1的商余。代码写法为:Frac (A)
如图,你会发现,其实frac就是fmod循环为1的封装,即fmod输入B值为1                    
       最近开发项目中发现商余其实可以做一个常用的效果,就是流光,核心的思想为:把光照看成是uv上的一个白到黑的渐变图,如果你已经写过代码应该很好理解。不过我还是解释一下吧。根据光照的计算,算的是一个向量跟法线之间的夹角,作为强弱,因为整个过程用的都是归一化的数值,所以,最后得到的数值就是cos(a)的数值,翻一下数学就知道他的值为-1到1,重置到0到1的时候,根据分部就有了跟uv一部分图片一样的渐变。
       那怎么做扫光呢?
       换个思路想想,向量,除了法线是向量,是不是位置也可以当做一个向量。那这样就可以在世界空间或者模型空间下去计算一张0到1的渐变图。这张图为了后面写的代码方便,我用temp来替代,那么核心代码就为:
                               float a =  Frac (temp+_Time.y*_Speed)  注释:_Time.y是unity自带变量,_Speed是自己定义的变量。这时候出来的数值还是0到1的渐变图,但是可以无限循环
                               float b = abs(a - 0.5)                               注释:跟0.5做一个减法,是为了让渐变图没有硬边,而变成中间实两边虚的效果,但是数值变成了0到0.5到0的渐变,,无限循环
                               float c = pow(b*2 , _powValue)           注释:_powValue是自定义的数值。通过乘于2变成0到1到0的渐变,然后通过自定义的数值_powValue做一个强度控制,这样就能开启扫光模式
                     这个做法的好处就在于,没有多余的贴图,也不需要多一套UV,扫光的精度也细致,性能非常高的做法。希望能帮到大家!
Clamp
Clamp 0-1
Clamp(Simple)     这三个节点的功能很类似,就是现在输出数据的最大最小值,其实跟Max和Min节点一起用很类似。主要的作用目前是让输出的图片上的数值在0-1,这样防止渲染出现不可思议的bug
Exp                    高等数学里面以自然数e为底数的指数函数,这个可以理解为输入值越大,数据变化越剧烈
Negate              输入值乘以-1输出,不理解用处,以后知道了补充
Inverse Lerp
Lerp
Lerp(Simple)     
                     
                    这三个lerp的对比图,Inverse Lerp的算法根据图像展示出来的情况感觉说有说不清楚,目前的测试结果来看,val值的输入只能在输入值的最大最小范围内,所以配了一张图,因为数值在0到1所以没有太多的变化,其实测试结果来看,数值会被强制规定到0-1。                    
                   测试截图1
                         
                    测试截图2
                        
                   算法截图:
                        
                    大体的意思是,每个数据运算情况,总结如下:
                    A>val>B时,输出值为   (A-val)/A-B/B
                    A<val<B时,输出值为  (B-val)/B+A/A
                    A>val和B>val的情况分两种:A>B输出为0,A<B输出为1
                    A<val和B<val的情况分两种:A<B输出为0,A>B输出为1
            lerp的算法就比较简单:(A*(1-T))+(B*T),如下图
                  
posterize     B/steps 做个一个个台阶,在台阶下的就等于台阶数值。B的数值为输入值的范围。这个效果可以做卡通的分层效果。


个人觉得这部分其实挺重要的,像光照这些其实都是一些固定的参数和结构,但是能把图处理成自己想要的效果就需要这些东西的配合,也可以说这里就是创造神奇的地方,希望大家抽时间多多看看理解 ,创造一些属于自己的效果






参与人数 2 元素币 +83 活跃度 +42
还没有设置签名!您可以在此展示你的链接,或者个人主页!

使用道具 举报 登录

回复 <
漫道  发表于 2018-8-15 10:34:19  
2#
楼主你好棒啊
回复 收起回复
使用道具
旋转的豆沙包  发表于 2018-8-15 14:22:32  
3#

哈哈哈,我都还没写,现在写好一部分了,可以先看看,希望能帮到你
回复 收起回复
使用道具
yangyu20  发表于 2018-10-16 11:23:57  
4#
謝謝樓主分享
回复 收起回复
使用道具
qq_马卡龙_WRh  发表于 2018-10-17 09:46:45  
5#

好棒,感谢楼主的无私分享
回复 收起回复
使用道具
peet07  发表于 2018-11-11 21:25:42  
6#

资源甚好,发帖艰辛,且阅且珍惜
回复 收起回复
使用道具
Paint_小熊  发表于 2018-11-12 16:24:05  
7#
过来学习了!
回复 收起回复
使用道具
minglihui998  发表于 2018-11-12 19:22:31  
8#
谢谢分享资源
回复 收起回复
使用道具
pxh02412  发表于 2018-11-16 06:33:05  
9#
每天一早上元素,挖矿撩妹两不误!
回复 收起回复
使用道具
free5days  发表于 2018-11-16 10:33:46  
10#
感谢楼主的分享,很棒的教程
回复 收起回复
使用道具
xt361344375  发表于 2018-11-16 10:43:45  
11#

你们大神真会玩
回复 收起回复
使用道具
tim_chen  发表于 2018-11-16 10:59:35  
12#
早安各位
回复 收起回复
使用道具
cs562981849  发表于 2018-11-16 12:32:32  
13#
给力啊强大啊
回复 收起回复
使用道具
qoocool  发表于 2018-11-16 15:15:51  
14#
只懂建模,也想学shader,不得其门而入,有推荐的入门书吗?
回复 收起回复
使用道具
qq_叫我小明_LUo  发表于 2018-11-16 23:37:08  
15#
6666666666666666666
回复 收起回复
使用道具
欧几里得  发表于 2018-11-22 09:43:00  
16#
带你赚币带你飞,元素里面有正妹!
回复 收起回复
使用道具
旋转的豆沙包  发表于 2018-11-29 23:15:48  
17#
qoocool 发表于 2018-11-16 15:15
只懂建模,也想学shader,不得其门而入,有推荐的入门书吗?

unityshader入门精要,这本书我看过了,挺好的。案例要亲手做一遍,然后牢固了以后开始看GPU精粹就可以了
回复 收起回复
使用道具
AUDA  发表于 2019-2-11 11:37:45  
18#
感谢大佬的分享!
回复 收起回复
使用道具
MasterZjy  发表于 2019-2-12 12:28:43  
19#
楼主很强
回复 收起回复
使用道具
MasterZjy  发表于 2019-2-18 10:49:52  
20#
又来啦
回复 收起回复
使用道具
12下一页

快来发表你宝贵的意见吧!

旋转的豆沙包 实名

通过了实名认证的内容创造者

  

主题
2
精华
1
超神
0
扩散
0
微金
83
智慧
1
余额
0
在线时间
66 小时
快速回复 返回顶部 返回列表