模型分解(瓦解、溶解...)Shader

20 篇文章 5 订阅

五一放假有事,没有更新blog了,放假回来继续更新,今天带了模型分解、瓦解、溶解的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
    }
}

代码中注释已经说的很清楚了,如果不明白的地方,欢迎留言交流。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值