unity 当前移动方向_Unity小工具:溶解效果(Dissolve)
溶解效果是一个很基础的效果,本文是对溶解效果的一个简单的总结,作为一个记录以达到技术积累的目的。同时会在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)相关推荐
- Unity Excel转Json小工具excel2json
在开发中表格转字符数据必不可少,在Github搜到一个小工具excel2json,还不错,并且支持批量操作 给出的官方文档:https://neil3d.github.io/app/excel2jso ...
- 在Unity上编写一个小工具--Excel导出Json
这是个Excel导出Json的工具类,需要放进Editor文件夹里,之后就可以在菜单上点击导出了 这个工具运行需要一个插件----NPOI,这个是用来读取excel文件的,这个插件的dll文件可以去网 ...
- Unity 坐标归零按钮小工具
从NGUI的源代码中抽取出来的, 可以直接用在没有NGUI的项目中 (要放在Editor文件夹下才有效) 源码如下: //--------------------------------------- ...
- Shader实例:溶解效果(Dissolve)
效果: 图左:一道金光闪过,瞬间灰飞烟灭 图右:燃烧效果,先过渡到黄色,然后渐渐过渡到黑色,最后消失殆尽. 这是游戏中常见的效果,各位可以想想自己玩过的游戏. 手头正在玩的,梦三国手游,死亡的时候就是 ...
- STM32——EMWIN窗口小工具(十三)
EMWIN 文章目录 EMWIN 前言 一.小工具基础知识 二. 如何使用小工具 1.重绘机制 2.小工具的使用 三.通用控件 API 函数 1.用于控件的 WM 函数 2.常用 API 函数 3._ ...
- Python|excel表格数据一键转json格式小工具|支持xlsx、xls格式转json|【源码+解析】
背景 最近在使用JavaScript编写一些浏览器RPA脚本,脚本使用过程中遇到一些问题,脚本使用的数据往往存放在excel表,但运行时只能读取json数据,导致频繁人工excel转json,效 ...
- 搭建系统|量化小工具升级!爬虫收集上市公司的公告,这样查阅才高效!
前言 "搭建系统"专栏系列前期一直以"选股"."回测"."行情"这三个主线展开的进程再不断地迭代开发工具. 我一直强调要 ...
- Unity实用小工具或脚本——可折叠伸缩的多级(至少三级)内容列表(类似于Unity的Hierarchy视图中的折叠效果)
目录 一.前言 二.实现 2.1.创建ScrollView 2.2.制作层级预设体BaseLevelPartObj 2.3.设置该预设体的初始化处理方法 2.4.读取Hierarchy的内容并创建UI ...
- unity小工具 创建常用文件夹
当我们新建一个unity工程时候,并不会赠送我们一整套的资源文件夹目录,需要我们自己去手动创建,十分麻烦还有可能写错. 这里介绍一个小工具用来创建常用文件夹 在unity中创建一个脚本,直接上代码 u ...
最新文章
- 龙果支付 mysql_龙果支付系统搭建与部署
- Gradle在Windows下的下载安装与配置以及在IDEA中配置以及修改jar包位置
- java map赋值给model_Map,Model,ModelMap使用方法
- P1273 有线电视网
- django的admin中显示为xxxx object以及元类Meta和__str__的使用
- mysql一对多代码_MySQL实现一对多查询的代码示例
- java中include标签的用法_原 ng-include用法分析以及多标签页面的简单实现方式
- 深度解读.NET 5授权中间件的执行策略
- 用stack处理中缀表达式【+、-、*、/、()】
- activeperl安装不成功_手把手教你:Windows系统上安装GPU深度学习环境
- 【Flink】Flink Remote Shuffle 开源:面向流批一体与云原生的 Shuffle 服务
- 【Vue-router中,require代替import解决vue项目首页加载时间过久】
- matlab使用load指令,科学网—matlab常用方法 - 陈超的博文
- Cesium:向地图中添加点的方法
- EBS中odf文件和xdf文件解释
- 【Linux】【操作】Linux操作集锦系列之一——定时任务
- 看老虎和狮子谁是兽中之王(国外学者详细论证)
- 行人检测/人体检测综述
- 未来计算机的研究热点主要有人工智能,人工智能的发展及其影响研究
- electron的单元测试(基于mocha+chai+karma)