DiffusePixel.shader 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. Shader "SupGames/PlanarReflection/Diffuse Pixel Lit" {
  2. Properties{
  3. _Color("Color", Color) = (1,1,1,1)
  4. _MainTex("Main Texture", 2D) = "white" {}
  5. _MaskTex("Mask Texture", 2D) = "white" {}
  6. _BlurAmount("Blur Amount", Range(0,7)) = 1
  7. }
  8. SubShader{
  9. Tags { "RenderType" = "Opaque" }
  10. LOD 100
  11. Pass
  12. {
  13. Tags { "LightMode" = "ForwardBase" }
  14. CGPROGRAM
  15. #pragma vertex vert
  16. #pragma fragment frag
  17. #pragma fragmentoption ARB_precision_hint_fastest
  18. #pragma shader_feature_local BLUR
  19. #pragma shader_feature_local VRon
  20. #pragma multi_compile_fwdbase novertexlight
  21. #pragma multi_compile_instancing
  22. #pragma multi_compile_fog
  23. #include "UnityCG.cginc"
  24. #include "AutoLight.cginc"
  25. UNITY_DECLARE_SCREENSPACE_TEXTURE(_ReflectionTex);
  26. #ifdef VRon
  27. UNITY_DECLARE_SCREENSPACE_TEXTURE(_ReflectionTexRight);
  28. #endif
  29. UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
  30. UNITY_DECLARE_SCREENSPACE_TEXTURE(_MaskTex);
  31. fixed4 _LightColor0;
  32. fixed _BlurAmount;
  33. fixed _RefAlpha;
  34. fixed4 _MainTex_ST;
  35. fixed4 _Color;
  36. fixed4 _ReflectionTex_TexelSize;
  37. struct appdata
  38. {
  39. fixed4 vertex : POSITION;
  40. fixed3 normal : NORMAL;
  41. fixed4 uv : TEXCOORD0;
  42. UNITY_VERTEX_INPUT_INSTANCE_ID
  43. };
  44. struct v2f
  45. {
  46. fixed4 pos : SV_POSITION;
  47. fixed4 uv : TEXCOORD0;
  48. fixed4 normal : TEXCOORD1;
  49. #if defined(BLUR)
  50. fixed4 offset : TEXCOORD2;
  51. #endif
  52. LIGHTING_COORDS(3, 4)
  53. UNITY_FOG_COORDS(5)
  54. UNITY_VERTEX_INPUT_INSTANCE_ID
  55. UNITY_VERTEX_OUTPUT_STEREO
  56. };
  57. v2f vert(appdata v)
  58. {
  59. v2f o;
  60. UNITY_SETUP_INSTANCE_ID(v);
  61. UNITY_INITIALIZE_OUTPUT(v2f, o);
  62. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
  63. o.uv.xy = TRANSFORM_TEX(v.uv, _MainTex);
  64. o.normal.xyz = normalize(mul(fixed4(v.normal, 0.0h), unity_WorldToObject).xyz);
  65. o.pos = UnityObjectToClipPos(v.vertex);
  66. fixed4 scrPos = ComputeNonStereoScreenPos(o.pos);
  67. o.uv.zw = scrPos.xy;
  68. o.normal.w = scrPos.w;
  69. #if defined(BLUR)
  70. fixed2 offset = _ReflectionTex_TexelSize.xy * _BlurAmount;
  71. o.offset = fixed4(-offset, offset);
  72. #endif
  73. TRANSFER_VERTEX_TO_FRAGMENT(o);
  74. UNITY_TRANSFER_FOG(o, o.pos);
  75. return o;
  76. }
  77. fixed4 frag(v2f i) : SV_Target
  78. {
  79. UNITY_SETUP_INSTANCE_ID(i);
  80. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
  81. fixed3 diffuseReflection = UNITY_LIGHTMODEL_AMBIENT.rgb + _LightColor0.rgb * dot(i.normal.xyz, _WorldSpaceLightPos0.xyz)* LIGHT_ATTENUATION(i);
  82. fixed4 color = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv.xy);
  83. fixed4 mask = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MaskTex, i.uv.xy);
  84. i.uv.zw /= i.normal.w;
  85. fixed4 reflection = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_ReflectionTex, i.uv.zw);
  86. #if defined(BLUR)
  87. i.offset /= i.normal.w;
  88. i.offset = fixed4(i.uv.zz + i.offset.xz, i.uv.ww + i.offset.yw);
  89. reflection += UNITY_SAMPLE_SCREENSPACE_TEXTURE(_ReflectionTex, i.offset.xz);
  90. reflection += UNITY_SAMPLE_SCREENSPACE_TEXTURE(_ReflectionTex, i.offset.xw);
  91. reflection += UNITY_SAMPLE_SCREENSPACE_TEXTURE(_ReflectionTex, i.offset.yz);
  92. reflection += UNITY_SAMPLE_SCREENSPACE_TEXTURE(_ReflectionTex, i.offset.yw);
  93. reflection *= 0.2h;
  94. #endif
  95. #ifdef VRon
  96. fixed4 reflectionr = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_ReflectionTexRight, i.uv.zw);
  97. #ifdef BLUR
  98. reflectionr += UNITY_SAMPLE_SCREENSPACE_TEXTURE(_ReflectionTexRight, i.offset.xz);
  99. reflectionr += UNITY_SAMPLE_SCREENSPACE_TEXTURE(_ReflectionTexRight, i.offset.xw);
  100. reflectionr += UNITY_SAMPLE_SCREENSPACE_TEXTURE(_ReflectionTexRight, i.offset.yz);
  101. reflectionr += UNITY_SAMPLE_SCREENSPACE_TEXTURE(_ReflectionTexRight, i.offset.yw);
  102. reflectionr *= 0.2h;
  103. #endif
  104. reflection = lerp(reflection, reflectionr, unity_StereoEyeIndex);
  105. #endif
  106. color = fixed4(diffuseReflection * color.rgb, 1.0h);
  107. UNITY_APPLY_FOG(i.fogCoord, color);
  108. return (lerp(color, reflection, _RefAlpha * mask.r) + lerp(reflection, color, 1 - _RefAlpha * mask.r))*_Color * 0.5h;
  109. }
  110. ENDCG
  111. }
  112. }
  113. }