找回密码
 立即注册
查看: 322|回复: 5

Unity小工具:溶解效果(Dissolve)

[复制链接]
发表于 2021-12-8 07:12 | 显示全部楼层 |阅读模式
溶解效果是一个很基础的效果,本文是对溶解效果的一个简单的总结,作为一个记录以达到技术积累的目的。同时会在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工程。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-12-8 07:18 | 显示全部楼层
请问这个shader如何增加透明贴图来控制特效面片呢?
发表于 2021-12-8 07:20 | 显示全部楼层
控制特效面片的啥
发表于 2021-12-8 07:22 | 显示全部楼层
比如一个模型本身就是用透明贴图来控制他的显示区,这个shader就无法使用了!,直接贴本该透明的位置会显示颜色将它填充起来,这个需求很有可能会在ui里运用[捂嘴]
发表于 2021-12-8 07:24 | 显示全部楼层
首先你要理解根本没有什么“本该透明”的说法,这个世界没有什么是“本来就这样”的。
至于透明的原理,你可以去了解一下alpha blend,然后自己去改造shader,就可以实现你想要的效果了。
发表于 2021-12-8 07:31 | 显示全部楼层
嗯了解了解!可能我用词不准确,意思是有透明贴图控制模型半透明的情况下再进行溶解!并非业内人,最近一直在做项目,晚上做U3D的动效作品,有限时间内追求效率,所以才做伸手党的,往后也打算把shader这一块学下来的!谢谢指点!
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-23 01:19 , Processed in 0.095112 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表