赞
踩
卡通效果的特点是颜色呈块状,即便有过渡,也是一块块色块。要实现主要用到floor方法,将本来是过渡的颜色铺平。
- Shader "MyShader/SS_23"
- {
- //属性
- Properties{
- _MainTex("Texture", 2D) = ""{}
- _Normal("Normal", 2D) = ""{}
- _Emission("Emission",Range(0,1))=0.5
- _Wrap("Wrap",Range(0,1))=0.5
- _LayerCount("LayerCount",float)=3
- }
- //子着色器
- SubShader
- {
- Tags{ "LightMode" = "UniversalForward" }
- CGINCLUDE
- #include "Lighting.cginc"
- sampler2D _MainTex;
- sampler2D _Normal;
- float _Emission;
- float _Wrap;
- float _LayerCount;
- struct appdata {
- float4 vertex : POSITION;
- float4 tangent : TANGENT;//切线方向
- float3 normal : NORMAL;//法线方向
- float4 uv : TEXCOORD0;
- };
- struct v2f
- {
- float4 pos : SV_POSITION;
- float2 uv : TEXCOORD0;
- //tangent空间的光线方向
- float3 lightDir : TEXCOORD1;
- };
-
-
- v2f vert(appdata v)
- {
- v2f o;
- o.pos = UnityObjectToClipPos(v.vertex);
- //这个宏为我们定义好了模型空间到切线空间的转换矩阵rotation,注意后面注释的是具体计算;
- TANGENT_SPACE_ROTATION;
- //float3 binormal = cross( normalize(v.normal), normalize(v.tangent.xyz) ) * v.tangent.w; //副切线方向,*w是为了确定方向正确
- //float3x3 rotation = float3x3( v.tangent.xyz, binormal, v.normal );//TangentBinormalNormal确定一个面的rotation状态
-
- //ObjectSpaceLightDir可以把光线方向转化到模型空间,然后通过rotation再转化到切线空间
- o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));
- o.uv=v.uv;
- return o;
- }
-
- fixed4 frag(v2f i) : SV_Target
- {
- //环境光
- fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
- //获取法线
- float3 normal = UnpackNormal(tex2D(_Normal, i.uv));
- //光照方向
- float3 lightDir = normalize(i.lightDir);
-
- // fixed3 lambert = max(0,dot(normal, lightDir));//Lambert光照模型
- fixed3 lambert =_Wrap*dot(normal, lightDir)+1-_Wrap; //半兰博通用化公式
- //加入光照,最终为颜色强度
- fixed3 diffuse = floor(lambert*_LayerCount) * _LightColor0.xyz + ambient;
-
- fixed4 color = tex2D(_MainTex, i.uv);
-
- return fixed4(diffuse* color.rgb+_Emission* color.rgb, 1.0);
- }
- ENDCG
- Pass
- {
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- ENDCG
- }
- }
- }
返回目录:https://blog.csdn.net/yzy1987523/article/details/106676451
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。