五一放假有事,没有更新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
}
}
代码中注释已经说的很清楚了,如果不明白的地方,欢迎留言交流。。。