Unity Shader-模型分解(瓦解、溶解)效果

发表于2018-10-18
评论0 7.8k浏览
类似一些游戏中的角色死亡,开发人员会费尽心力的表现人物死亡效果。今天就给大家带来模型分解、瓦解、溶解的Shader,直接上代码,如下:
Shader "Custom/Disintegrate"
{
    Properties
    {
        _MainTex ("Texture(RGB)", 2D) = "white" {}   //主纹理
        _Bumpmap("Bump Texture(RGB)",2D)="bump"{}    //法线贴图
        _NoiseTex("Noise Tex(RGB)",2D)="white"{}     //噪声图,用于提供分解源数据
        _DisintegrateAmount("Disintegrate Amount",Range(0.0,1.01))=0.0  //分解比例,0代表不分解,1.01代表完全分解完
        _DisintegrateColor("Disintegrate Color",Color)=(1.0,0.5,0.2,0.0) //分解颜色
        _EdgeEmission("Edge Emission",Color)=(0,0,0,0)   //分解时边缘环境光颜色
        _DissolveEdge("Dissolve Range",Range(0.0,0.1))=0.01 //要分解的边界的范围值
        _TileFactor("Tile Factor",Range(0.0,4.0))=1.0   //分解因子
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        CGPROGRAM
        #pragma target 3.0
        #pragma surface surf Lambert addshadow nolightmap
//exclude_path:prepass 或者 exclude_path:forward - 使用指定的渲染路径,不需要生成通道。
//addshadow - 添加阴影投射 & 收集通道(collector passes)。通常用自定义顶点修改,使阴影也能投射在任何程序的顶点动画上。
//dualforward - 在正向(forward)渲染路径中使用 双重光照贴图(dual lightmaps)。
//fullforwardshadows - 在正向(forward)渲染路径中支持所有阴影类型。
//decal:add - 添加贴图着色器(decal shader) (例如: terrain AddPass)。
//decal:blend - 混合半透明的贴图着色器(Semitransparent decal shader)。
//softvegetation - 使表面着色器(surface shader)仅能在Soft Vegetation打开时渲染。
//noambient - 不适用于任何环境光照(ambient lighting)或者球面调和光照(spherical harmonics lights)。
//novertexlights - 在正向渲染(Forward rendering)中不适用于球面调和光照(spherical harmonics lights)或者每个顶点光照(per-vertex lights)。
//nolightmap - 在这个着色器上禁用光照贴图(lightmap)。(适合写一些小着色器)
//nodirlightmap - 在这个着色器上禁用方向光照贴图(directional lightmaps)。 (适合写一些小着色器)。
//noforwardadd - 禁用正向渲染添加通道(Forward rendering additive pass)。 这会使这个着色器支持一个完整的方向光和所有光照的per-vertex/SH计算。(也是适合写一些小着色器).
//approxview - 着色器需要计算标准视图的每个顶点(per-vertex)方向而不是每个像索(per-pixel)方向。 这样更快,但是视图方向不完全是当前摄像机(camera) 所接近的表面。
//halfasview - 在光照函数(lighting function)中传递进来的是half-direction向量,而不是视图方向(view-direction)向量。 Half-direction会计算且会把每个顶点(per vertex)标准化。这样做会提高执行效率,但是准确率会打折扣。
       struct Input{
          float2 uv_MainTex;
          float2 uv_BumpMap;
       };
       sampler2D _MainTex;
       sampler2D _Bumpmap;
       sampler2D _NoiseTex;
       float _DisintegrateAmount;
       float4 _DisintegrateColor;
       float _DissolveEdge;
       float _TileFactor;
       float4 _EdgeEmission;
       void surf(Input IN,inout SurfaceOutput o)
       {
          float clipval=tex2D(_NoiseTex,IN.uv_MainTex*_TileFactor).rgb-_DisintegrateAmount;   //这个地方,你可以换成rgb中的任意一个值都行
          clip(clipval);
          if(clipval<_DissolveEdge&&_DisintegrateAmount>0)
          {//分解部分 ,显示环境光以及分解颜色
            o.Emission=_EdgeEmission;
            o.Albedo=_DisintegrateColor;
          }
          else
          {//没有分解部分,正常显示纹理
            o.Albedo=tex2D(_MainTex,IN.uv_MainTex).rgb;
          }
          //法线贴图
          float4 normal=tex2D(_Bumpmap,IN.uv_BumpMap);
          o.Normal=UnpackNormal(normal);
       }
       ENDCG
    }
}
来自:https://blog.csdn.net/a958832776/article/details/71108859

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引