shader总结五

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


opaque是不透明的意思

上一节中把图片弄成水波一样的代码只适用于静态波动,如果我们要让鼠标在图片上滑动的时候有水波的效果就不能用上一节的代码了,比如如下效果:

首先在c#脚本中这样定义,putpop函数用于在中心位置设置一个能量很大的像素,computeWave函数用于计算每个像素周围的插值并且能量衰减



鼠标指针指在某点的时候,就波动,不在就不波动,这个uv的偏移必须要在外部(c#脚本中update检测鼠标指针位置来计算uv偏移来实现)

在计算波纹的函数中,对波纹的每一个像素取其周围的八个点的和,除4减原来的像素,将每个像素限定在[-1,1]之间,uv的u偏移为左右像素的插值,v偏移为上下像素的插值,

把该像素的坐标(w,h)以及该像素颜色(这里rgb中b分量怎么是0),视频讲的是把uv的插值通过颜色的形式赋给它,waveB[w,h]-=waveB[w,h]*0.001f;不管waveB[w,h]为正还是负经过计算都会趋近于0,意思是让该值的能量衰减一点点。



而在shader中把uv限定在[0,1]之间乘以一个很小的值


效果如下:


当然poppup函数是将中心点置为1向四周能量衰减,实际上我们应该找到鼠标的指针坐标,该坐标一个圆的范围内对周围坐标进行能量赋值


我们将poppup函数改成这个函数,并且调用putDrop(64,64)效果如下,能量从中间向周边扩散,并且波的能量能扩散到图片边界还能反弹回来


最后检测鼠标的指针,射线检测把指针坐标从世界空间转到模型空间即可


效果如下:


对于效率问题:当前的宽和高我们设定的是128*128,但是当把宽高设为512*512时候,查看帧率为16.7FPS非常消耗GPU



优化方法

耗时的计算是computeWave方法,我们将耗时计算放在一个子线程去调用,在onstart方法里面开辟子线程调用computeWave方法,


而且调用该方法是一直调用,声明一个bool为true,在computeWave里面如果为true就一直循环执行,ondestroy方法里面设为false。update执行函数也是过了一小段时间执行一次,所以在子线程中也要睡眠一段时间再循环执行一次,我们怎么知道一次update间隔多少毫秒呢?用下面方法得到间隔了sleepTime毫秒

然后在子线程中睡眠对应的时间,子线程睡眠的单位是毫秒


运行程序发现报错


意思是setPixel函数不能再子线程中运行,不仅仅是该函数tex_uv.Apply()也不能在子线程中运行,解决办法,由于是把一个颜色值交个pixel,通过缓冲区的方法解决

声明一个在onstart里面初始化,把pixel那句话替换成


在update函数中调用


然后运行程序,发现帧速率提升到了76.5左右fps



另一种优化方法

关闭垂直同步,在unity->edit->project settings->Quality在inspector的最下面选择Dont Sync,这样fps会上升到260fps左右



最快的优化方案:异构平台通用化计算(把cpu的计算移植到gpu上)也叫GPGPU,在unity中computer shader就是这种技术


垂直同步:
简单来说垂直同步的作用是防止画面撕裂。因为画面的渲染不是整个画面一起渲染的,是逐行或者逐列渲染。如果关闭垂直同步,而电脑配置不够,则画面在高速移动中会出现这一画面还没渲染完成就开始下一画面的撕裂情况。

打开与关闭垂直同步的主要区别在于那些高速运行的游戏,比如实况,FPS游戏,打开后能防止游戏画面高速移动时画面撕裂现象,当然打开后如果你的游戏画面FPS数能达到或超过你显示器的刷新率,这时你的游戏画面FPS数被限制为你显示器的刷新率。你会觉得原来移动时的游戏画面是如此舒服,如果达不到会出现不同程度的跳帧现象,FPS与刷新率差距越大跳帧越严重。关闭后除高速运动的游戏外其他游戏基本看不出画面撕裂现象。关闭此选项画面流畅程度会有一定的提高。

为什么是否关闭垂直同步信号会影响我们CS中的fps数值?道理一点都不复杂,首先我们平时运行操作系统一般屏幕刷新率是多少?大概一般都是在85上下吧,那么显卡就会每按照85的频率时间来发送一个垂直同步信号,信号和信号的时间间隔是85的分辨率所写一屏图像时间。
如果我们选择“等待垂直同步信号”(也就是我们平时所说的“垂直同步打开”),那么在游戏中,或许强劲的显卡迅速的绘制完一屏的图像,但是没有垂直同步信号的到达,显卡无法绘制下一屏,只有等85单位的信号到达,才可以绘制。这样fps自然要受到操作系统刷新率运行值的制约。
而如果我们选择“不等待垂直同步信号”(也就是我们平时所说“关闭垂直同步”),那么游戏中作完一屏画面,显卡和显示器无需等待垂直同步信号,就可以开始下一屏图像的绘制,自然可以完全发挥显卡的实力。
但是,不要忘记,正是因为垂直同步的存在,才能使得游戏进程和显示器刷新率同步,使得画面平滑,使得画面稳定。取消了垂直同步信号,固然可以换来更快的速度,但是在图像的连续性上,性能势必打折扣。这也正是很多朋友抱怨关闭垂直后发现画面不连续的理论原因!

摘自:http://www.dnpz.net/diannaozhishi/1565.html


Alpha和blend混合:

把一个物体弄成半透明:只需加上一句话



虽然两个物体对于地面都能呈现半透明的状态但是两个物体在一前一后,红色显示不出后面的蓝色,这和render Quene渲染队列有关,在渲染队列中有如下几种方式,Fackground是先渲染该物体,再渲染其他物体,最后的Overlay是所有物体都渲染完了再渲染该物体,默认的是Geonetry


Zwrite的作用:控制哪些像素放到深度缓冲队列,默认是On状态,如果要绘制一个实心物体,就on状态,如果绘制半透明状态就Zwrite off,对于Zwrite的理解是z轴(我们距离屏幕的轴)该点的颜色是否写入深度缓冲区,因为物体深度在近剪裁平面和远剪裁平面之间的z轴(Ztest通过(Ztest也叫深度测试))我们才要把颜色写入

将两个物体都渲染队列都设置为Transparent状态且Zwrite Off状态或者红色是Zwrite off,蓝色on


还要把两个shader重新设置(刷新)一下就出现了希望的样子



半透明着色:对于人物在墙里面也可以进行对人物进行高亮的颜色显示


案例:对于如下的物体,要想让蓝色胶囊体在前面的墙显示出来,在蓝色胶囊体的shader中alpha肯定是混合的,zwrite是on状态,ztest有lequal和状态,lequal是比当前写入的z轴帧缓冲的值小于或等于,那么就写入,很显然就把墙的那个写进来了,胶囊体没写进来,因此把ztest设成greater,结果发现成这样了,原因很简单,上面的部分只有胶囊体本身,但是大于上部分的z轴的才写进帧缓冲,所以最终没有写进来任何信息

                              

解决方法:写多个pass通道

第一个pass:           第二个pass:  

                         

注意第二个ztest是less小于而不是lequal小于等于,第二个blend也可以不写

另一个问题:效果已经实现但是如果前面的墙是个半透明的墙,为什么显示出来的下面的胶囊体的颜色就不是蓝色而是红色的呢?

原因是如果是半透明的墙它的Zwrite为off因此按照第二个pass来处理第二个pass通道ztest 是less返回的颜色是个红色,第一个pass返回的是蓝色,因此最终返回的是红色。

解决方法,用renderType来替换,详细再看下72课时

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果你想制作一个在Unity中用于展示气泡效果的Shader,可以参考以下步骤: 1. 创建一个Unlit Shader:在Unity中创建一个新的Shader,选择Unlit作为Shader的类型。 2. 添加一个圆形边缘:使用Shader中的片段着色器,添加一个圆形的边缘效果。你可以通过使用一个Sin函数和一个Time变量来实现这个效果。 3. 添加一个噪声纹理:使用一个噪声纹理来模拟气泡的表面纹理,这可以通过使用Perlin Noise等算法来实现。可以通过调整噪声的细节和强度来控制效果的外观。 4. 添加透明度:将气泡的透明度与表面法线的深度相关联,这可以通过计算表面法线和视线之间的角度来实现。 5. 调整材质属性:最后,使用Unity材质属性来控制气泡的颜色、透明度和噪声纹理的细节等。 以上是一个简单的气泡Shader的制作步骤,你可以根据自己的需求和技术水平进行更加复杂的调整和改进。 ### 回答2: Unity中的气泡Shader是一种用于渲染气泡或类似效果的渲染器。该Shader利用了Unity引擎的渲染管线,通过对顶点和片元进行处理,实现了气泡表面的扭曲效果和光照效果。 气泡Shader的实现主要包括两个关键步骤:扭曲效果和光照效果。首先,通过对顶点的位移和法线的变换,创建了气泡表面模糊和扭曲的效果。这种扭曲可以通过利用噪音贴图或数学函数来产生。其次,通过计算光照模型,实现了气泡表面的反射和折射效果。通常可以使用菲涅尔反射率和折射率来模拟光照效果。 气泡Shader的使用可以应用于各种游戏和图形效果中。例如,在海洋场景中,使用气泡Shader可以模拟出海浪上的气泡效果。在虚拟现实中,使用气泡Shader可以增强场景的真实感,并使气泡能够正确地反射和折射周围的光线。此外,气泡Shader还可以用于创建其他特殊效果,比如泡沫和水珠等。 在Unity中使用气泡Shader相对较简单。可以通过创建一个新的Shader并在其中编写扭曲和光照的逻辑。然后将该Shader应用于场景中的具有气泡效果的物体上。为了获得更好的效果,还可以通过调整Shader的属性和参数来控制气泡的大小、扭曲程度和光照效果等。 总结起来,Unity中的气泡Shader是一种用于实现气泡表面的扭曲和光照效果的渲染器。它可以应用于各种场景和特效中,为游戏和图形效果增加视觉上的真实感和趣味性。 ### 回答3: Unity中的气泡Shader是一种用来创建逼真的气泡效果的图形渲染技术。它通过对气泡进行形状、透明度、反射和折射等参数的模拟来实现。 在气泡Shader中,首先要考虑的是气泡的形状。通常,气泡在顶部较宽且渐变变窄,因此可以使用一种特殊的顶点变换来实现这种形状,例如使用一个带有Sin函数的顶点偏移。 其次,需要考虑气泡的透明度。通过使用透明度贴图或者根据气泡表面法线和摄像机方向的夹角来动态计算透明度,可以使气泡在顶部更加透明且向底部逐渐变得不透明。 另外,气泡球面上的反射和折射效果对于增强真实感十分重要。可以使用环境反射贴图和立方体贴图来模拟环境的反射,使气泡看起来更有光泽。同时,可以根据折射理论和气泡表面的法线向量来计算出折射效果,使气泡看起来像是真实的折射介质。 最后,为了增加气泡的动态感,可以使用时间因子来调整气泡表面的波动效果。可以通过使用Sin函数或噪声函数来计算波动的幅度和频率,并将其与时间因子相关联,以便气泡看起来像是不断变化的。 综上所述,Unity中的气泡Shader是通过模拟气泡的形状、透明度、反射和折射等参数来实现逼真的气泡效果的图形渲染技术。通过对气泡形状、透明度、表面反射和折射的处理,以及添加动态波动效果,可以使气泡看起来更加真实和生动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值