shder总结四

素材取自蛮牛教育,自己学习就行啦,别转载了


对于向量的夹角注意的是:如果入射光和法线方向是这样的,那么夹角就是大于90度的角


实际上应该把入射光的方向取反,这样得到的角度才是我们想要的,是从顶点指向光源的



顶点b减顶点a得到的向量方向是从a指向b


UnityCG cginc里面提供了许多内置的光照函数,我们可以调用里面的内置函数

对于点积的两个向量,光向量和法向量必须处在同一个空间中

顶点函数计算光照执行效率高,片元函数计算光照较慢但是更加细腻平滑



对于高光反射,先做出反射光R(reflection),v是相机的方向,求cos(V,R)如果两个角比较小就把高光反射的亮度增大

通过CG函数R=Reflect(L,N)这里的L为入射光,方向是从眼到顶点的方向,得到反射光


视频里面讲的兰伯特模型和phone模型:

兰伯特:环境光+漫反射

phone模型:环境光+漫反射+高光反射


对于顶点和法线要放在世界空间下的操作最好在片元函数中而不要在顶点函数中做,原因是在顶点函数中处理得到的世界空间下的法线再传给片元函数,那么多个像素对应一个法线,没有做插值运算


如果想让自己写的shader能够有投射阴影的效果,注意的是,如果只要方向光的投影效果,只需在shader中再加入一个pass,LightMode写成这样就行


如果不仅要方向光的阴影还要点光源的阴影,那么把这个pass删去在shader最后加了这个,说明程序会自动检测如果要显示出投影效果,就能显示出来


blend:有多个pass时会计算光并把多个pass光叠加

如果要实现比较复杂的光照最好使用surface shader,它里面提供了一些光照的框架和渲染路径

world2boject是4*4矩阵要和一个3阶矩阵相乘那么要强转成3*3矩阵




怎么实现?

原理:球的表面颜色亮度大,球中间亮度低,因为每个顶点距离球心距离都是一样的不能通过length来做,我们发现球顶点的法线和相机到顶点的向量的夹角越小,越黑,



把前面的物体弄成透明的,当bright很小乘以fixed4(1,1,1,1)中最后的alfha也弄得很小,blend混合多个pass,srcalpha是当前的alpha,  oneminussrcalpha是1减去当前的alpha让之前的物体通过



如果有多个pass会叠加但是只想让一个pass起作用,那么在其他pass加上blend  zero one表示当前pass的pass输出为zero,让上一次的pass输出为one全部输出



在顶点函数中设置两种不同颜色在物体上不同颜色中间会做插值运算,但是在片元函数中设置两种不同颜色则不会做插值运算


Lightmapping光照贴图技术

优点是可以通过较少的性能消耗使静态场景看上去更加真实,丰富,更加具有立体感;缺点是不能用来实时地处理动态光照。当实时光源和阴影对游戏的性能的影响会很大。这时使用Lightmapping技术,将光线效果预渲染成贴图使用到多边形上模拟光影效果。


UV动画:

                     

对于这张图我们要向使用uv动画更改纹理的缩放和平移达到如上动画的效果,也即每个0.1秒就显示一个格子并且换成另一个格子,形成序列帧动画

因为每个一段时间要进行缩放和平移变化,用协程,在c#脚本中

首先x轴缩放到原来的三分之一,y轴缩放到原来的三分之一拿到1号格子的纹理,然后计算平移到第k个格子上




这种效果怎么实现?

原理:这张纹理在一个点上颜色变化是周期的,sin函数


TRANSFORM_TEX主要作用是拿顶点的uv去和材质球的tiling和offset作运算,确保材质球里的缩放和偏移设置是正确的o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);换成o.uv = v.texcoord.xy;也是能正常显示的;相当于Tiling 为(1,1)Offset为(0,0)


如何把上面的图像变得模糊?


对向前图像的颜色值进行多次采样,把当前的颜色值加上平移0.01后的颜色值,多次这样然后颜色值取平均


当然,也可以用导数的形式来进行采样达到模糊的效果。

 

导数的含义是变化率,所以如果把图像旋转时图像是模糊的,正面的时候图像清晰的,效果如下,那么对z求导数




这种效果怎么实现?




如果将两个纹理进行混合并且实现动态效果,可以使用alpha和blend运算或者多个pass通道的方法,但是问题是把前面的纹理变成半透明,它占据的像素越多,计算量就越大,对GPU的负担就越大,导致性能下降,如果用多个pass进行混合,pass越多,增加draw call调用的计算量,因此为了优化的手段,我们不用这两种方式

比如上面的图和另一张图叠加


最终达到这样的效果:星星是动态的



因为第一张图背景是黑色的,颜色值趋近于0因此两个图颜色相加颜色为亮的图,如果是mainColor*=color_1那么效果如下:


如果把该shader的pass下面加上colormask r,意思是只显示颜色r部分的分量


效果如下


如果是colormask rg,说明只显示r和g的颜色分量,红和绿叠加为黄色

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值