Unity shader之Flowmap贴图的原理_flow贴图-程序员宅基地

技术标签: unity shader编程  游戏渲染实战  

一、FlowMap的原理

流动贴图,为了实现一个流动的效果,然而它存储的信息是顶点的移动向量信息,只占用RG通道,将一个归一化二维向量保存到像素中,所以我们看到的flowmap都是如下颜色的(0.5, 0.5, 0);

它的实现思路是借鉴了向量场的概念,可以看一下参考中的向量场相关介绍;

在shader的实现中,它利用了uv动画的原理,也就是我们需要根据flowmap中的信息做uv偏移,然后通过时间来改变偏移大小,从而产生一个流动效果;但是,我们不能允许uv的偏移量过大,因为随着时间叠加后,如果偏移量过大,肯定会导致采样错误,所以我们需要将时间来控制到0,1的一个循环中,这样就可以保证不会出现采样的异常了;

片元着色器如下所示,

            fixed4 frag (v2f i) : SV_Target
            {
                float3 flowDir = tex2D(_FlowMapTex, i.uv) * 2.0f - 1.0f;
                flowDir *= _Speed;

                float phase0 = abs(fmod(_Time.y, 2) - 1);

                half3 tex0 = tex2D(_MainTex, i.uv + flowDir.xy * phase0);
                return fixed4(tex0, 1);
            }

但是上述这种实现方式会在一个周期之后有跳变的效果;

为了解决这个跳变的效果,采用的解决方案是采样两次,然后在这两次采样之间做一个插值,然后做一个插值;注意插值系数也是要动态改变的,而且插值系数采用了绝对值的计算,也就是它是循环的(从0到1,再从1到0,而不会从1跳变到0)

            fixed4 frag (v2f i) : SV_Target
            {
                float3 flowDir = tex2D(_FlowMapTex, i.uv) * 2.0f - 1.0f;
                flowDir *= _Speed;

                float phase0 = abs(fmod(_Time.y, 2) - 1);
                float phase1 = frac(_Time.y  + 0.5f);

                half3 tex0 = tex2D(_MainTex, i.uv + flowDir.xy * phase0);
                half3 tex1 = tex2D(_MainTex, i.uv + flowDir.xy * phase1);

                float flowLerp = abs((phase0 - 0.5f) / 0.5f);
                half3 finalColor = lerp(tex0, tex1, flowLerp);

                return fixed4(finalColor, 1);
            }

二、参考

知乎 简单了解flowmap的使用(UE4)-https://zhuanlan.zhihu.com/p/33288033

知乎-向量场的介绍:https://zhuanlan.zhihu.com/p/46362611

Medium-FlowMap着色器教程(UE4):https://medium.com/@thelouishong/shader-tutorial-flow-map-4410af832a8d

Github-Unity Flow Map Shader代码:https://gist.github.com/TarasOsiris/e0e6e6c3b8fdb0d8074b

http://alex.vlachos.com/graphics/Vlachos-SIGGRAPH10-WaterFlow.pdf

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36383623/article/details/104872448

智能推荐

ipod 硬件检测_ipod检测-程序员宅基地

文章浏览阅读604次。ipod 硬件检测 操作方法_ipod检测

服务器巡检系统-程序员宅基地

文章浏览阅读1.7k次。实时监控后台录入的网络设备在线情况,断线提醒,历史状态查询,实时监控图表,后台录入数据后自动生成拓扑图。_服务器巡检系统

软件项目管理 2.1.项目立项_软件项目立项流程-程序员宅基地

文章浏览阅读9.5k次。软件项目管理 ——2.1.项目立项 归档于软件项目管理初级学习路线第二章 软件项目确立《初级学习路线合集 》前言大家好,这节我们学习软件项目立项概念一、项目启动背景项目启动的背景大致可以分为四类:1.符合法规,法律或者社会要求2.满足相关方的要求或需求3.执行,变更业务或技术战略4.创造,改进或修复产品,过程或服务二、软件项目启动启动项目是因为客户的需求,然后实现这个要求,最后提交给客户。但是 不是所有的需求都可以被_软件项目立项流程

C# MenuStrip中的item快捷键设置_menustrip快捷键-程序员宅基地

文章浏览阅读4.5k次,点赞5次,收藏8次。基本知识MenuStrip是C#用来做Windows窗口应用程序的一个常用组件,翻译过来就是菜单栏(类似文件、编辑、视图、帮助等等这一栏)。所有经常看到有很多软件的文件-保存选项后面写着Ctrl+S,这就是利用快捷键间接调用点击保存这个事件的功能。实验首先在visual studio中依次点击文件-新建-项目,出现下图按图中数字顺序选择,第三项可以自己设置。确定完成后,可以在解决方案资源管..._menustrip快捷键

6. JavaScript排序算法动画演示效果实现_js快速排序动画演示效果实现-程序员宅基地

文章浏览阅读396次。之前在知乎看到有人在问 自己写了一个冒泡排序算法如何用HTML,CSS,JavaScript展现出来排序过程。   感觉这个问题还挺有意思 。前些时间就来写了一个。这里记录一下实现过程。基本的思想是把排序每一步的时候每个数据的值用DOM结构表达出来。问题一:如何将JavaScript排序的一步步进程展现出来?我试过的几种思..._js快速排序动画演示效果实现

接口防重复提交_接口重复提交问题-程序员宅基地

文章浏览阅读865次。ps:以前经常会处理此类问题,但一直没有闲暇时间记录,今天就把这个东西记录一下。1、提出问题业务中不可避免出现重复提交的问题,场景大概如下:​ 用户请求开户,后端接口处于开户处理中,在这个过程中,用户再次请求开户,那么此时在未做对应处理的情况下,即使业务代码中去判断开户重复也是无用的,因为一般增删改操作处于事务当中,后一个请求不会读取到上一个请求未提交事务的数据(如果读取到了那就是脏读),所以我们得在业务代码执行之前进行相应的防重复提交处理。2、解决方案大概思路如下:​ 1、用户第一次请求时,放_接口重复提交问题

随便推点

达梦数据库基础2-数据库实例(Linux)_linux达梦数据库创建实例-程序员宅基地

达梦数据库基础2-数据库实例(Linux),介绍了在Linux系统中创建和管理达梦数据库实例的方法,包括使用图形界面工具和命令工具来进行操作。摘要长度:88个字符。

几种常规信号(射频)参数测试方法_射频测试s参数-程序员宅基地

文章浏览阅读1w次,点赞14次,收藏119次。最近出了点意外,FPGA的事暂时搁置了。没办法,谁让“老板“”让我做什么,我就得做什么呢!!!这几天调试一块射频板,测试过程中简单总结了几个参数的简单调试方法,在此做个记录,以备以后可能还会用到。当然能够知道这些,也离不开百度,谷歌,还有前辈们的指导,在此表示感谢,话不多说 直接开内容,弄完睡觉。0、测试环境:所有测试激励均为单频信号源。- 1、S参数(1)测试仪器:矢量网络分析仪,电源..._射频测试s参数

手把手教你 3 分钟搞定个人网站 http 免费升级到 https-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏3次。你知道的越多,不知道的就越多,业余的像一棵小草!你来,我们一起精进!你不来,我和你的竞争对手一起精进!编辑:业余草推荐:https://www.xttblog.com/?p=5081手把..._复制下面的网址下载时选择 源文件 (普通下载)我们的用户软件终身免费升级http

七段数码管的显示 滚动显示_数码管滚动显示的摘要-程序员宅基地

文章浏览阅读3.8k次。初级实验_数码管滚动显示的摘要

fifo IP 核使用常见问题汇总_fifo ip核使用读写位宽不一致设置-程序员宅基地

文章浏览阅读6.3k次,点赞7次,收藏50次。fifo 做为FPGA常用的一个模块,每次用的时候都是丢三落四,不是忘这里就是忘哪里。现在记录下来。1--- 关于FIFO 的复位,是高复位。懒得用复位信号的时候,就是把复位信号一直拉低。后来仿真发现,这样fifo是不工作的,因 为仿真时候观察写入和读出数据计数都是0。在虚伪的时候还需要注意,复位信号如果和fifo的时钟不同步,一定要在新时钟下面打两拍。 还有..._fifo ip核使用读写位宽不一致设置

Codeforces的使用-程序员宅基地

文章浏览阅读2.1w次,点赞55次,收藏206次。1.首先,输入codeforces点击进入。2. 进入之后,你将会看到这样的一个页面,先点击左上角,Register(注册)3.emmmmmmm如下,#我的QQ邮箱,懒得删。按照它的提示输入信息,完成之后,Register一下。然后正常登入就好4.你可以输入自己的信息,这里就不多说了5.如图,说的很详细了吧6.选题目点击进入..._codeforces

推荐文章

热门文章

相关标签