请选择 进入手机版 | 继续访问电脑版
开启辅助访问

QQ登录

注册 找回密码
返回列表 发新帖 标签:
Shader
材质球
TA
图形学
渲染
引擎
可视化
shader工具
显示全部 11
查看: 5004
回复: 25

Shader shaderforge自学笔记

 

222

元素币

628

活跃度

5

贡献值

元素灵

Rank: 2Rank: 2

积分
2370
主题
2
精华
1
扩散
0
首发
0
土豪金
55
在线时间
60 小时

TA的画板

发消息

发表于 2018-8-14 22:18:36
TA资源类型
TA资源类型: 算法思路 其它 
shader资源类型: 其它 
适用引擎: 其它 
资源介绍: -

马上注册成为元素者,获取海量元素资源,结识各路大神级人物

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

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)
303495b7597beb641f.png 如图,你会发现,其实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的数值为输入值的范围。这个效果可以做卡通的分层效果。


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






评分

参与人数 1元素币 +80 活跃度 +40 收起 理由
元素界王 + 80 + 40 非常有用!

查看全部评分

还没有设置签名!您可以在此展示你的链接,或者个人主页!

回复 使用道具 举报 登录

论坛版权

盘 TA

楼主你好棒啊

回复 使用道具 举报 登录

盘 TA


哈哈哈,我都还没写,现在写好一部分了,可以先看看,希望能帮到你

回复 使用道具 举报 登录

盘 TA

謝謝樓主分享

回复 使用道具 举报 登录

盘 TA


好棒,感谢楼主的无私分享

回复 使用道具 举报 登录

盘 TA


资源甚好,发帖艰辛,且阅且珍惜

回复 使用道具 举报 登录

盘 TA

过来学习了!

回复 使用道具 举报 登录

盘 TA

谢谢分享资源

回复 使用道具 举报 登录

盘 TA

每天一早上元素,挖矿撩妹两不误!

回复 使用道具 举报 登录

盘 TA

感谢楼主的分享,很棒的教程

回复 使用道具 举报 登录

盘 TA


你们大神真会玩

回复 使用道具 举报 登录

盘 TA

早安各位

回复 使用道具 举报 登录

盘 TA

给力啊强大啊

回复 使用道具 举报 登录

盘 TA

只懂建模,也想学shader,不得其门而入,有推荐的入门书吗?

回复

unityshader入门精要,这本书我看过了,挺好的。案例要亲手做一遍,然后牢固了以后开始看GPU精粹就可以了  发表于 2018-11-29 23:15

回复 使用道具 举报 登录

盘 TA

6666666666666666666

回复 使用道具 举报 登录

盘 TA

带你赚币带你飞,元素里面有正妹!

回复 使用道具 举报 登录

盘 TA

qoocool 发表于 2018-11-16 15:15
只懂建模,也想学shader,不得其门而入,有推荐的入门书吗?

unityshader入门精要,这本书我看过了,挺好的。案例要亲手做一遍,然后牢固了以后开始看GPU精粹就可以了

回复 使用道具 举报 登录

盘 TA

感谢大佬的分享!

回复 使用道具 举报 登录

盘 TA

楼主很强

回复 使用道具 举报 登录

盘 TA

又来啦

回复 使用道具 举报 登录

盘 TA

多谢大神分享

回复 使用道具 举报 登录

盘 TA

多谢大神分享

回复 使用道具 举报 登录

盘 TA

多谢大神分享

回复 使用道具 举报 登录

盘 TA

厉害了    刚开始学

回复 使用道具 举报 登录

盘 TA

资源甚好,且行且阅读

回复 使用道具 举报 登录

盘 TA

不错

回复 使用道具 举报 登录

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

元素大事件!上一条 /1 下一条

快速回复 返回顶部 返回列表