BlendModesOverlay.shader 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
  2. Shader "Hidden/BlendModesOverlay" {
  3. Properties {
  4. _MainTex ("Screen Blended", 2D) = "" {}
  5. _Overlay ("Color", 2D) = "grey" {}
  6. }
  7. CGINCLUDE
  8. #include "UnityCG.cginc"
  9. struct v2f {
  10. float4 pos : SV_POSITION;
  11. float2 uv[2] : TEXCOORD0;
  12. };
  13. sampler2D _Overlay;
  14. sampler2D _MainTex;
  15. half _Intensity;
  16. half4 _MainTex_TexelSize;
  17. half4 _UV_Transform = half4(1, 0, 0, 1);
  18. v2f vert( appdata_img v ) {
  19. v2f o;
  20. o.pos = UnityObjectToClipPos(v.vertex);
  21. o.uv[0] = float2(
  22. dot(v.texcoord.xy, _UV_Transform.xy),
  23. dot(v.texcoord.xy, _UV_Transform.zw)
  24. );
  25. #if UNITY_UV_STARTS_AT_TOP
  26. if(_MainTex_TexelSize.y<0.0)
  27. o.uv[0].y = 1.0-o.uv[0].y;
  28. #endif
  29. o.uv[1] = v.texcoord.xy;
  30. return o;
  31. }
  32. half4 fragAddSub (v2f i) : SV_Target {
  33. half4 toAdd = tex2D(_Overlay, i.uv[0]) * _Intensity;
  34. return tex2D(_MainTex, i.uv[1]) + toAdd;
  35. }
  36. half4 fragMultiply (v2f i) : SV_Target {
  37. half4 toBlend = tex2D(_Overlay, i.uv[0]) * _Intensity;
  38. return tex2D(_MainTex, i.uv[1]) * toBlend;
  39. }
  40. half4 fragScreen (v2f i) : SV_Target {
  41. half4 toBlend = (tex2D(_Overlay, i.uv[0]) * _Intensity);
  42. return 1-(1-toBlend)*(1-(tex2D(_MainTex, i.uv[1])));
  43. }
  44. half4 fragOverlay (v2f i) : SV_Target {
  45. half4 m = (tex2D(_Overlay, i.uv[0]));// * 255.0;
  46. half4 color = (tex2D(_MainTex, i.uv[1]));//* 255.0;
  47. // overlay blend mode
  48. //color.rgb = (color.rgb/255.0) * (color.rgb + ((2*m.rgb)/( 255.0 )) * (255.0-color.rgb));
  49. //color.rgb /= 255.0;
  50. /*
  51. if (Target > ½) R = 1 - (1-2x(Target-½)) x (1-Blend)
  52. if (Target <= ½) R = (2xTarget) x Blend
  53. */
  54. float3 check = step(0.5, color.rgb);
  55. float3 result = 0;
  56. result = check * (half3(1,1,1) - ( (half3(1,1,1) - 2*(color.rgb-0.5)) * (1-m.rgb)));
  57. result += (1-check) * (2*color.rgb) * m.rgb;
  58. return half4(lerp(color.rgb, result.rgb, (_Intensity)), color.a);
  59. }
  60. half4 fragAlphaBlend (v2f i) : SV_Target {
  61. half4 toAdd = tex2D(_Overlay, i.uv[0]) ;
  62. return lerp(tex2D(_MainTex, i.uv[1]), toAdd, toAdd.a * _Intensity);
  63. }
  64. ENDCG
  65. Subshader {
  66. ZTest Always Cull Off ZWrite Off
  67. ColorMask RGB
  68. Pass {
  69. CGPROGRAM
  70. #pragma vertex vert
  71. #pragma fragment fragAddSub
  72. ENDCG
  73. }
  74. Pass {
  75. CGPROGRAM
  76. #pragma vertex vert
  77. #pragma fragment fragScreen
  78. ENDCG
  79. }
  80. Pass {
  81. CGPROGRAM
  82. #pragma vertex vert
  83. #pragma fragment fragMultiply
  84. ENDCG
  85. }
  86. Pass {
  87. CGPROGRAM
  88. #pragma vertex vert
  89. #pragma fragment fragOverlay
  90. ENDCG
  91. }
  92. Pass {
  93. CGPROGRAM
  94. #pragma vertex vert
  95. #pragma fragment fragAlphaBlend
  96. ENDCG
  97. }
  98. }
  99. Fallback off
  100. } // shader