卡通渲染效果shard-1

来源:互联网 发布:mac 视频播放器 慢放 编辑:程序博客网 时间:2024/05/16 19:54
  1. Shader "Hidden/Edge Detect Normals" {  
  2. Properties {  
  3.  _MainTex ("Base (RGB)", RECT) = "white" {}  
  4.  _NormalsTexture ("Normals", RECT) = "white" {}  
  5. }  
  6. SubShader {  
  7.  Pass {  
  8.   ZTest Always Cull Off ZWrite Off  
  9.   Fog { Mode off }  
  10. CGPROGRAM  
  11. #pragma vertex vert  
  12. #pragma fragment frag  
  13. #pragma fragmentoption ARB_precision_hint_fastest  
  14. #include "UnityCG.cginc"   
  15. uniform samplerRECT _MainTex;  
  16. uniform samplerRECT _NormalsTexture;  
  17. uniform float4 _MainTex_TexelSize;  
  18. struct v2f {  
  19.  float4 pos : POSITION;  
  20.  float2 uv[3] : TEXCOORD0;  
  21. };  
  22. v2f vert( appdata_img v )  
  23. {  
  24.  v2f o;  
  25.  o.pos = mul (glstate.matrix.mvp, v.vertex);  
  26.  float2 uv = MultiplyUV( glstate.matrix.texture[0], v.texcoord );  
  27.  o.uv[0] = uv;  
  28.  o.uv[1] = uv + float2(-_MainTex_TexelSize.x, -_MainTex_TexelSize.y);  
  29.  o.uv[2] = uv + float2(+_MainTex_TexelSize.x, -_MainTex_TexelSize.y);  
  30.  return o;  
  31. }  
  32. half4 frag (v2f i) : COLOR  
  33. {  
  34.  half4 original = texRECT(_MainTex, i.uv[0]);  
  35.    
  36.  // three samples from normals+depth buffer    
  37.  half4 normalD1 = texRECT(_NormalsTexture, i.uv[0]);  
  38.  half4 normalD2 = texRECT(_NormalsTexture, i.uv[1]);  
  39.  half4 normalD3 = texRECT(_NormalsTexture, i.uv[2]);  
  40.    
  41.  // normals filter   
  42.  half3 n1 = normalD1.rgb*2-1;  
  43.  half3 n2 = normalD2.rgb*2-1;  
  44.  half3 n3 = normalD3.rgb*2-1;  
  45.  half2 ndiff;  
  46.  ndiff.x = dot( n1, n2 );  
  47.  ndiff.y = dot( n1, n3 );  
  48.  ndiff -= 0.9;  
  49.  ndiff = ndiff > half2(0,0) ? half2(1,1) : half2(0,0);  
  50.  half ndiff1 = ndiff.x * ndiff.y;  
  51.  original.rgb *= ndiff1;  
  52.    
  53.  // depth filter   
  54.  float2 zdiff;  
  55.  zdiff.x = normalD1.a - normalD2.a;  
  56.  zdiff.y = normalD1.a - normalD3.a;  
  57.  zdiff = abs( zdiff ) - 0.05;  
  58.  zdiff = zdiff > half2(0,0) ? half2(0,0) : half2(1,1);  
  59.  original *= zdiff.x*zdiff.y;  
  60.    
  61.  return original;  
  62. }  
  63. ENDCG  
  64.  }  
  65. }  
  66. Fallback off  
  67. }