小伙伴们,大家好,汪汪又给大家带来shader案例了,这次我们制作热空气扭曲效果。其实汪汪每次的入门实践,都是给大家一种解决问题的思路,小伙伴们看了以后多多融会贯通,那么后面小伙伴们就可以自己实现一些比较复杂的效果了。 我们先来看看,我们的热空气扭曲效果如何: 为了更应景,汪汪从商店下载了一个沙漠里的场景。当然了,热空气扭曲,最多的其实是用在火把,火堆,和火相关的一些场景上面,当然啦,利用此原理,也可以制作水面效果:


原理
原理其实就是利用UV扭曲,让UV进行偏移,然后在此UV基础上,输出和背景图一摸一样的图片渲染到模型上,如果想制作后处理的话,就只需要扭曲当前渲染帧即可。
如何扭曲UV?
老样子,我们还是需要一张噪波图来采样。 float4 offset= tex2D(_NoiseMap, i.uv); //采集噪波图中的颜色值,0-1之间 fixed4 col = tex2D(_MainTex, i.uv-offset.xy); //利用采集到的噪波值来偏移原图UV
如何渲染背景图?
这里我们需要引入一个新的Pass: GrabPass { "_GrabTex" } GrabPass就是用来捕获当前画面的,而中括号里,就是我们捕获图片的变量名。 值得注意的是,此Pass如果用在移动平台上,会耗费大量性能,不推荐使用。如果非得使用,利用后处理中的Graphic.Bilt()思路性能耗费相对较低。 我们用用看: 首先是它的位置: 接下来是用法: 我们利用如上代码,我们的模型,就变成了完全的“透明”状态,其实只是贴图覆盖,就是贴图和背景是一模一样的: 接下来,我们实现扭曲效果: 加上我们上面的扭曲代码,需要注意的是,主帖图,换成我们的抓屏了哦: 这样一来,扭曲效果就实现啦~: 静态扭曲倒是实现了,但是我们需要动态的,提到动态,我们自然而然就想到_Time,这里出现了大量的黑色区域,别担心,这是因为扭曲幅度过大导致,这里我们加入两个变量来控制速度和幅度: 其中_Speed可以控制速度,_Step可以控制偏移幅度。






好啦,我们的热空气shader到此就完成啦~

至于水面效果的话,汪汪是扭曲了贴图,然后在扭曲的基础上,加了一些HDR颜色值来实现辉光,再利用Sin函数来控制模型点的y值实现上下蠕动,这里主要讲解热空气,所以汪汪不会过多赘述,但是如果小伙伴们感兴趣,可以留言讨论。
本文详细介绍了如何使用Unity Shader创建热空气扭曲效果,通过UV扭曲和噪波图采样实现动态扭曲,同时提供了控制速度和幅度的方法。
668

被折叠的 条评论
为什么被折叠?



