Unity Shader-模型分解(瓦解、溶解)效果
发表于2018-10-18
类似一些游戏中的角色死亡,开发人员会费尽心力的表现人物死亡效果。今天就给大家带来模型分解、瓦解、溶解的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