溶解效果是一个很基础的效果,本文是对溶解效果的一个简单的总结,作为一个记录以达到技术积累的目的。同时会在GitHub实现一个小例子,来验证理论。

溶解效果

要实现溶解效果,最重要的就是让某些像素显示,某些像素消失,如下图所示。

为了实现这种效果,我们需要标记哪些像素要显示,哪些像素要消失,于是使用一张噪声图来给每一个像素做标记(Mask)。如下图所示,这个噪声图就是在Photoshop里用“云彩”工具生成的。由于噪声图的随机性,使得像素的显示和消失显得非常不规则,也就满足了对不规则溶解效果的需求。

在shader中“抠掉”一个像素,可以使用clip函数。在片段着色器中调用clip(x)即可丢弃这个像素,其中x为数字,当x小于0.0,该像素则会被丢弃。

在片段着色器中根据当前uv,采样噪声图,就可以获得一个遮罩值。通常的实现方式为clip(遮罩值 - 阈值),这句代码表示当遮罩值小于阈值时,则当前像素会被丢弃。如果阈值会从0到1动态变化,那么在游戏里将会看到一个动态溶解的动画过程。

以上就是溶解的基本原理。

half dissove = tex2D(_DissTex, i.uv).r;clip(dissolve - _Clip);

定向溶解

有的时候,溶解需要有一定的方向性,比如纸张从左下角往右上角燃烧的效果。设clip = dissolve - _Clip,那么我们可以在clip的基础上,给一个方向相关的因子,即clip = clip + worldFactor。其中worldFactor就是方向相关的因子。

这里给出一种方向相关因子的计算方法。以下为计算worldFactor的顶点着色器代码。

float4 worldPos = mul(unity_ObjectToWorld, v.vertex);
float3 rootPos = float3(unity_ObjectToWorld[0].w, unity_ObjectToWorld[1].w, unity_ObjectToWorld[2].w);
float3 pos = worldPos.rgb - rootPos;
float posOffset = dot(normalize(_DissolveDir), pos);
o.worldFactor = posOffset;

其中rootPos为物体质心所在的坐标值,因为世界变换矩阵的w行向量即为世界位置(详细请搜索世界矩阵介绍和推导相关文章)。worldPos为当前顶点所处世界位置,在Unity里需要注意这里不允许动态合批,否则worldPos就失效了。那么worldPos - rootPos就可以求得顶点偏离模型质心的偏移向量,最后偏移向量在_DissolveDir方向上的投影长度就是我们所需要的方向因子,因为投影越长,那么在_DissolveDir方向上像素离质心越远。

最终在片段着色器里如下实现即可。

fixed dissove = tex2D(_DissTex, i.uv).r;
dissove = (dissove - _Clip) + i.worldFactor * _WorldSpaceScale;
clip(dissove);

顶点溶解

有的时候,溶解需要从中心点向外溶解,或者从某一点开始向外溶解。这个就比较简单了,根据定向溶解的原理,最重要的是找到一个因子。顶点溶解的因子根据像素离中心点距离来求得即可,也就是使用distance函数就可以求得。代码如下。

fixed dissove = tex2D(_DissTex, i.uv).r;
float dist = distance(_DissolveCenterUV, i.uv);
dissove = dissove + dist * _WorldSpaceScale;

总结

本文实现的效果如下。

该文章总结了以下知识点。

  • 溶解基础原理
  • 定向溶解和定点溶解算法

验证详见GitHub工程。

unity 当前移动方向_Unity小工具:溶解效果(Dissolve)相关推荐

  1. Unity Excel转Json小工具excel2json

    在开发中表格转字符数据必不可少,在Github搜到一个小工具excel2json,还不错,并且支持批量操作 给出的官方文档:https://neil3d.github.io/app/excel2jso ...

  2. 在Unity上编写一个小工具--Excel导出Json

    这是个Excel导出Json的工具类,需要放进Editor文件夹里,之后就可以在菜单上点击导出了 这个工具运行需要一个插件----NPOI,这个是用来读取excel文件的,这个插件的dll文件可以去网 ...

  3. Unity 坐标归零按钮小工具

    从NGUI的源代码中抽取出来的, 可以直接用在没有NGUI的项目中 (要放在Editor文件夹下才有效) 源码如下: //--------------------------------------- ...

  4. Shader实例:溶解效果(Dissolve)

    效果: 图左:一道金光闪过,瞬间灰飞烟灭 图右:燃烧效果,先过渡到黄色,然后渐渐过渡到黑色,最后消失殆尽. 这是游戏中常见的效果,各位可以想想自己玩过的游戏. 手头正在玩的,梦三国手游,死亡的时候就是 ...

  5. STM32——EMWIN窗口小工具(十三)

    EMWIN 文章目录 EMWIN 前言 一.小工具基础知识 二. 如何使用小工具 1.重绘机制 2.小工具的使用 三.通用控件 API 函数 1.用于控件的 WM 函数 2.常用 API 函数 3._ ...

  6. Python|excel表格数据一键转json格式小工具|支持xlsx、xls格式转json|【源码+解析】

    背景    最近在使用JavaScript编写一些浏览器RPA脚本,脚本使用过程中遇到一些问题,脚本使用的数据往往存放在excel表,但运行时只能读取json数据,导致频繁人工excel转json,效 ...

  7. 搭建系统|量化小工具升级!爬虫收集上市公司的公告,这样查阅才高效!

    前言 "搭建系统"专栏系列前期一直以"选股"."回测"."行情"这三个主线展开的进程再不断地迭代开发工具. 我一直强调要 ...

  8. Unity实用小工具或脚本——可折叠伸缩的多级(至少三级)内容列表(类似于Unity的Hierarchy视图中的折叠效果)

    目录 一.前言 二.实现 2.1.创建ScrollView 2.2.制作层级预设体BaseLevelPartObj 2.3.设置该预设体的初始化处理方法 2.4.读取Hierarchy的内容并创建UI ...

  9. unity小工具 创建常用文件夹

    当我们新建一个unity工程时候,并不会赠送我们一整套的资源文件夹目录,需要我们自己去手动创建,十分麻烦还有可能写错. 这里介绍一个小工具用来创建常用文件夹 在unity中创建一个脚本,直接上代码 u ...

最新文章

  1. 龙果支付 mysql_龙果支付系统搭建与部署
  2. Gradle在Windows下的下载安装与配置以及在IDEA中配置以及修改jar包位置
  3. java map赋值给model_Map,Model,ModelMap使用方法
  4. P1273 有线电视网
  5. django的admin中显示为xxxx object以及元类Meta和__str__的使用
  6. mysql一对多代码_MySQL实现一对多查询的代码示例
  7. java中include标签的用法_原 ng-include用法分析以及多标签页面的简单实现方式
  8. 深度解读.NET 5授权中间件的执行策略
  9. 用stack处理中缀表达式【+、-、*、/、()】
  10. activeperl安装不成功_手把手教你:Windows系统上安装GPU深度学习环境
  11. 【Flink】Flink Remote Shuffle 开源:面向流批一体与云原生的 Shuffle 服务
  12. 【Vue-router中,require代替import解决vue项目首页加载时间过久】
  13. matlab使用load指令,科学网—matlab常用方法 - 陈超的博文
  14. Cesium:向地图中添加点的方法
  15. EBS中odf文件和xdf文件解释
  16. 【Linux】【操作】Linux操作集锦系列之一——定时任务
  17. 看老虎和狮子谁是兽中之王(国外学者详细论证)
  18. 行人检测/人体检测综述
  19. 未来计算机的研究热点主要有人工智能,人工智能的发展及其影响研究
  20. electron的单元测试(基于mocha+chai+karma)

热门文章

  1. M1 Mac:支持 USB-C,但不完全支持
  2. 字节跳动证实28岁员工离世;《英雄联盟》回应服务器崩了:官方直接回退了旧版本;Deno 1.19 发布|极客头条...
  3. 云版 Android 系统来了?
  4. 华为首秀 AI 全栈软件平台!
  5. 不招聘数据科学家的 7 个理由!
  6. Python 数据分析实战:经典的同期群分析
  7. “不会SQL,干啥都不行!”资深研发:这是程序员的必备技能!
  8. 打破硬件边界,华为EMUI分布式技术如何连接万物
  9. 为什么我在实时编码时失败了?
  10. 谁说互联网行业发展走到了尽头?