哈哈,今天给大家带来的是卡通shader,其实可能会有很多朋友奇怪,明明是3D的模型,不追求仿真的效果,为什么要弄什么卡通的特效。其实我想说,不为什么玩家喜欢那么我们就要弄。
(别喷我,我实话实说。。。。。。。)好了,实话实说,要知道世界上面是有很多的像博主这样的二次元爱好者(其实就是宅男。。。。。。),在博主眼里萌萌的二次元是超级可爱的,哈哈哈哈哈哈。
好了扯到正题上面了,其实用shader来做卡通特效是有非常多的写法,这里博主就介绍一种使用简单的卡通shader。
Shader "Custom/Toon" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_Bump ("Bump", 2D) = "bump" {}
_Tooniness ("Tooniness", Range(0.1,20)) = 4
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert finalcolor:final
sampler2D _MainTex;
sampler2D _Bump;
float _Tooniness;
struct Input {
float2 uv_MainTex;
float2 uv_Bump;
};
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Normal = UnpackNormal( tex2D(_Bump, IN.uv_Bump));
o.Albedo = c.rgb;
o.Alpha = c.a;
}
void final(Input IN, SurfaceOutput o, inout fixed4 color) {
color = floor(color * _Tooniness)/_Tooniness;
}
ENDCG
}
FallBack "Diffuse"
}
_MainTex ("Base (RGB)", 2D) = "white" {} //这句话的意思是拿到shader面板里面的2D贴图
_Bump ("Bump", 2D) = "bump" {} //这句话的意思是拿到2D的法线贴图
_Tooniness ("Tooniness", Range(0.1,20)) = 4 //这句话的意思是规定一个卡通值
CGPROGRAM //这句话的意思是声明使用CG的函数
#pragma surface surf Lambert finalcolor:final //这句话的意思是使用unity里面自带的Lambert光照模型,并且声明final函数。
half4 c = tex2D (_MainTex, IN.uv_MainTex); // 这句话里面关键的一点就是tex2D()这个函数
这句话的意思是根据这张图片和相应的uv点或者该点的tex2d数值。
o.Normal = UnpackNormal( tex2D(_Bump, IN.uv_Bump)); //这句话的意思是获得法线贴图该点的法向量
color = floor(color * _Tooniness)/_Tooniness; //这句话的意思是先把颜色值和_Tooniness的值相乘向下取整接着除以_Tooniness,使得值被归入到一个已知的集合之中,达到了简化颜色的目的。
好了,最后来给大家展示一下效果,因为图片和模型之类的东西暂时手里面没有现成的,所以暂借一下大神的资源,哈哈哈哈哈(别打我。。。。)
其实卡通特效是有很多实现方式的,还有一种轮廓描边可以更好地体现出效果,这里就留待各位朋友自己去探索了,欢迎大家来和我交流,我的邮箱是609555184@qq.com , 大家也可以来群里面找我344682050,哈哈哈哈哈哈