当前位置: 首页 > news >正文

unityshader——Dissolve效果

实现Dissolve效果的关键:

1.网格体逐渐消失 Alpha Test 半透明

2.边缘发光 Distance

3.方向性 中心溶解 边缘 整体

4.其他特征 UV动画 世界位置偏移动画

网格体逐渐消失:

  1. 使用的噪声纹理的R通道控制消融区域 通过_BurnAmount参数控制消融程度 使用clip()函数实现像素级消融,丢弃低于阈值的像素。

    // 采样消融贴图(R通道控制消融) fixed3 burn = tex2D(_BurnMap, i.uvBurnMap).rgb; clip(burn.r - _BurnAmount);

边缘色:

消融边缘颜色的宽度_LineWidth,使用smoothstep创建平滑过渡, t值表示在消融边缘区域内的程度(0-1)在两种边缘颜色之间插值, 使用pow增强颜色对比度

fixed t = 1 - smoothstep(0.0, _LineWidth, burn.r - _BurnAmount); fixed3 burnColor = lerp(_BurnFirstColor, _BurnSecondColor, t); burnColor = pow(burnColor, 5);

添加边缘光

float edgeMask = smoothstep(0.0, _LineWidth * 0.5, burn.r - _BurnAmount); float emissionFactor = pow(1.0 - edgeMask, _EmissionFalloff); float3 emission = _EmissionColor.rgb * emissionFactor * _EmissionIntensity;

距离衰减:相机越远,发光越弱

float dist = distance(_WorldSpaceCameraPos, i.worldPos); float distAtten = saturate(1 - dist / 20.0); emission *= distAtten;

方向性:偏移/膨胀

偏移:

顶点着色器

//顶点偏移计算 v.vertex.xyz+=_OffsetDirection * saturate(_BurnAmount - _OffsetThreshold) * _OffsetScale;

膨胀:

//沿法线方向偏移,向外膨胀 v.vertex.xyz += v.normal * saturate(_BurnAmount - _OffsetThreshold) * _OffsetScale;

计算光照:

float3 tangentLightDir = normalize(i.lightDir); fixed3 tangentNormal = UnpackNormal(tex2D(_BumpMap, i.uvBumpMap)); fixed3 albedo = tex2D(_MainTex,i.uv).rgb; fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo; // 半兰伯特光照模型(增强暗部) fixed halfLambert = dot(tangentNormal,tangentLightDir)* 0.5 + 0.5; fixed3 diffuse = _LightColor0.rgb * albedo * halfLambert;

阴影处理:

Pass{ Tags {"LightMode" = "ShadowCaster"} CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_shadowcaster #include "UnityCG.cginc" sampler2D _BurnMap; float4 _BurnMap_ST; float _BurnAmount; half4 _OffsetDirection; half _OffsetThreshold; half _OffsetScale; struct v2f { V2F_SHADOW_CASTER; float2 uvBurnMap : TEXCOORD1; }; v2f vert(appdata_base v) { v2f o; v.vertex.xyz+=_OffsetDirection * saturate(_BurnAmount - _OffsetThreshold) * _OffsetScale; TRANSFER_SHADOW_CASTER_NORMALOFFSET(o) o.uvBurnMap = TRANSFORM_TEX(v.texcoord, _BurnMap); return o; } fixed4 frag(v2f i) : SV_Target { fixed3 burn = tex2D(_BurnMap, i.uvBurnMap).rgb; clip(burn.r - _BurnAmount); SHADOW_CASTER_FRAGMENT(i) } ENDCG }
http://www.jsqmd.com/news/468082/

相关文章:

  • ZYNQ LWIP PHY驱动适配实战:以景略JL2121为例解决链路速度获取失败
  • 从物理模型到数据驱动:低光照增强技术演进中的核心范式对比
  • Rocky Linux 8.5上5分钟搞定Wine安装:阿里云EPEL镜像加速指南
  • BC-MRI-SEG基准:如何用统一数据集破解乳腺癌AI分割的“泛化之困”?
  • gocron故障排除终极指南:10个常见问题及解决方案大全
  • conda环境打包 环境注册
  • 微服务之间的调用关系如何处理,才能防止循环依赖
  • 鸿蒙真机调试遇阻:hvigor报错compatibleSdkVersion不兼容的深度解析与实战修复
  • 从主键到性能路径:彻底理解 SAP ABAP 中的 primary index
  • 如何监控和管理微服务之间的调用关系
  • RuoYi-Plus(前后端分离)大文件视频上传实战:从本地存储到进度条优化
  • 调试aspnetcore-Vue-starter应用:Vue DevTools使用指南
  • 数据驱动决策实战指南:从理论到落地的关键步骤
  • GDSFactory环境配置(PyCharm+Git+KLayout)
  • 华测导航CGI610与ROS实战:如何将GPCHC协议数据转换为NavSatFix和GPSFix格式
  • pybind11与RDK S100 BPU深度融合:高性能AI加速器的Python绑定完整指南
  • 从零到一:基于私有医学影像(nii.gz)的2D TransUNet实战复现指南
  • 智能家居【home assistant】(二)-集成xiaomi_home
  • Noty通知库终极指南:无依赖JavaScript通知解决方案
  • VirtualBox 桥接网络实战:从零配置到局域网互通
  • 如何用HandyControl的EasingFunction创建流畅动画:从入门到精通的完整指南
  • 智能家居【home assistant】(一)-在Windows电脑上运行home assistant
  • 终极指南:深度解析DeepSeek、Qwen、OLMo等顶级大语言模型技术报告
  • 探索PID模糊控制在S7-200PLC程序电子皮带秤自动配料系统设计中的应用与优化
  • 语音识别终极调试指南:annyang.js开发者模式深度解析
  • Nord终极指南:16种北极色板的设计哲学与实战应用
  • 【路径规划】RRT星结合小能量轨迹计算实现机器人路径规划【含Matlab源码 15153期】
  • Google Play Asset Delivery实战:如何为游戏资源包选择最佳分发模式(附避坑指南)
  • WhichKey.nvim 终极排序指南:7 种智能排序算法深度解析
  • 家庭宽带选购指南:看懂带宽/时延/RTT参数,避免被运营商忽悠