TiltShiftHdrLensBlur.shader 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
  2. Shader "Hidden/Dof/TiltShiftHdrLensBlur" {
  3. Properties {
  4. _MainTex ("-", 2D) = "" {}
  5. }
  6. CGINCLUDE
  7. #include "UnityCG.cginc"
  8. struct v2f
  9. {
  10. float4 pos : SV_POSITION;
  11. float2 uv : TEXCOORD0;
  12. float2 uv1 : TEXCOORD1;
  13. };
  14. sampler2D _MainTex;
  15. sampler2D _Blurred;
  16. float4 _MainTex_TexelSize;
  17. float _BlurSize;
  18. float _BlurArea;
  19. #ifdef SHADER_API_D3D11
  20. #define SAMPLE_TEX(sampler, uv) tex2Dlod(sampler, float4(uv,0,1))
  21. #else
  22. #define SAMPLE_TEX(sampler, uv) tex2D(sampler, uv)
  23. #endif
  24. v2f vert (appdata_img v)
  25. {
  26. v2f o;
  27. o.pos = UnityObjectToClipPos (v.vertex);
  28. o.uv.xy = v.texcoord;
  29. o.uv1.xy = v.texcoord;
  30. #if UNITY_UV_STARTS_AT_TOP
  31. if (_MainTex_TexelSize.y < 0)
  32. o.uv1.y = 1-o.uv1.y;
  33. #else
  34. #endif
  35. return o;
  36. }
  37. static const int SmallDiscKernelSamples = 12;
  38. static const float2 SmallDiscKernel[SmallDiscKernelSamples] =
  39. {
  40. float2(-0.326212,-0.40581),
  41. float2(-0.840144,-0.07358),
  42. float2(-0.695914,0.457137),
  43. float2(-0.203345,0.620716),
  44. float2(0.96234,-0.194983),
  45. float2(0.473434,-0.480026),
  46. float2(0.519456,0.767022),
  47. float2(0.185461,-0.893124),
  48. float2(0.507431,0.064425),
  49. float2(0.89642,0.412458),
  50. float2(-0.32194,-0.932615),
  51. float2(-0.791559,-0.59771)
  52. };
  53. static const int NumDiscSamples = 28;
  54. static const float3 DiscKernel[NumDiscSamples] =
  55. {
  56. float3(0.62463,0.54337,0.82790),
  57. float3(-0.13414,-0.94488,0.95435),
  58. float3(0.38772,-0.43475,0.58253),
  59. float3(0.12126,-0.19282,0.22778),
  60. float3(-0.20388,0.11133,0.23230),
  61. float3(0.83114,-0.29218,0.88100),
  62. float3(0.10759,-0.57839,0.58831),
  63. float3(0.28285,0.79036,0.83945),
  64. float3(-0.36622,0.39516,0.53876),
  65. float3(0.75591,0.21916,0.78704),
  66. float3(-0.52610,0.02386,0.52664),
  67. float3(-0.88216,-0.24471,0.91547),
  68. float3(-0.48888,-0.29330,0.57011),
  69. float3(0.44014,-0.08558,0.44838),
  70. float3(0.21179,0.51373,0.55567),
  71. float3(0.05483,0.95701,0.95858),
  72. float3(-0.59001,-0.70509,0.91938),
  73. float3(-0.80065,0.24631,0.83768),
  74. float3(-0.19424,-0.18402,0.26757),
  75. float3(-0.43667,0.76751,0.88304),
  76. float3(0.21666,0.11602,0.24577),
  77. float3(0.15696,-0.85600,0.87027),
  78. float3(-0.75821,0.58363,0.95682),
  79. float3(0.99284,-0.02904,0.99327),
  80. float3(-0.22234,-0.57907,0.62029),
  81. float3(0.55052,-0.66984,0.86704),
  82. float3(0.46431,0.28115,0.54280),
  83. float3(-0.07214,0.60554,0.60982),
  84. };
  85. float WeightFieldMode (float2 uv)
  86. {
  87. float2 tapCoord = uv*2.0-1.0;
  88. return (abs(tapCoord.y * _BlurArea));
  89. }
  90. float WeightIrisMode (float2 uv)
  91. {
  92. float2 tapCoord = (uv*2.0-1.0);
  93. return dot(tapCoord, tapCoord) * _BlurArea;
  94. }
  95. float4 fragIrisPreview (v2f i) : SV_Target
  96. {
  97. return WeightIrisMode(i.uv.xy) * 0.5;
  98. }
  99. float4 fragFieldPreview (v2f i) : SV_Target
  100. {
  101. return WeightFieldMode(i.uv.xy) * 0.5;
  102. }
  103. float4 fragUpsample (v2f i) : SV_Target
  104. {
  105. float4 blurred = tex2D(_Blurred, i.uv1.xy);
  106. float4 frame = tex2D(_MainTex, i.uv.xy);
  107. return lerp(frame, blurred, saturate(blurred.a));
  108. }
  109. float4 fragIris (v2f i) : SV_Target
  110. {
  111. float4 centerTap = tex2D(_MainTex, i.uv.xy);
  112. float4 sum = centerTap;
  113. float w = clamp(WeightIrisMode(i.uv.xy), 0, _BlurSize);
  114. float4 poissonScale = _MainTex_TexelSize.xyxy * w;
  115. #ifndef SHADER_API_D3D9
  116. if(w<1e-2f)
  117. return sum;
  118. #endif
  119. for(int l=0; l<NumDiscSamples; l++)
  120. {
  121. float2 sampleUV = i.uv.xy + DiscKernel[l].xy * poissonScale.xy;
  122. float4 sample0 = SAMPLE_TEX(_MainTex, sampleUV.xy);
  123. sum += sample0;
  124. }
  125. return float4(sum.rgb / (1.0 + NumDiscSamples), w);
  126. }
  127. float4 fragField (v2f i) : SV_Target
  128. {
  129. float4 centerTap = tex2D(_MainTex, i.uv.xy);
  130. float4 sum = centerTap;
  131. float w = clamp(WeightFieldMode(i.uv.xy), 0, _BlurSize);
  132. float4 poissonScale = _MainTex_TexelSize.xyxy * w;
  133. #ifndef SHADER_API_D3D9
  134. if(w<1e-2f)
  135. return sum;
  136. #endif
  137. for(int l=0; l<NumDiscSamples; l++)
  138. {
  139. float2 sampleUV = i.uv.xy + DiscKernel[l].xy * poissonScale.xy;
  140. float4 sample0 = SAMPLE_TEX(_MainTex, sampleUV.xy);
  141. sum += sample0;
  142. }
  143. return float4(sum.rgb / (1.0 + NumDiscSamples), w);
  144. }
  145. float4 fragIrisHQ (v2f i) : SV_Target
  146. {
  147. float4 centerTap = tex2D(_MainTex, i.uv.xy);
  148. float4 sum = centerTap;
  149. float w = clamp(WeightIrisMode(i.uv.xy), 0, _BlurSize);
  150. float4 poissonScale = _MainTex_TexelSize.xyxy * float4(1,1,-1,-1) * 2;
  151. #ifndef SHADER_API_D3D9
  152. if(w<1e-2f)
  153. return sum;
  154. #endif
  155. for(int l=0; l<NumDiscSamples; l++)
  156. {
  157. float4 sampleUV = i.uv.xyxy + DiscKernel[l].xyxy * poissonScale;
  158. float4 sample0 = SAMPLE_TEX(_MainTex, sampleUV.xy);
  159. float4 sample1 = SAMPLE_TEX(_MainTex, sampleUV.zw);
  160. sum += sample0 + sample1;
  161. }
  162. return float4(sum.rgb / (1.0 + 2.0 * NumDiscSamples), w);
  163. }
  164. float4 fragFieldHQ (v2f i) : SV_Target
  165. {
  166. float4 centerTap = tex2D(_MainTex, i.uv.xy);
  167. float4 sum = centerTap;
  168. float w = clamp(WeightFieldMode(i.uv.xy), 0, _BlurSize);
  169. float4 poissonScale = _MainTex_TexelSize.xyxy * float4(1,1,-1,-1) * w;
  170. #ifndef SHADER_API_D3D9
  171. if(w<1e-2f)
  172. return sum;
  173. #endif
  174. for(int l=0; l<NumDiscSamples; l++)
  175. {
  176. float4 sampleUV = i.uv.xyxy + DiscKernel[l].xyxy * poissonScale;
  177. float4 sample0 = SAMPLE_TEX(_MainTex, sampleUV.xy);
  178. float4 sample1 = SAMPLE_TEX(_MainTex, sampleUV.zw);
  179. sum += sample0 + sample1;
  180. }
  181. return float4(sum.rgb / (1.0 + 2.0 * NumDiscSamples), w);
  182. }
  183. ENDCG
  184. Subshader {
  185. ZTest Always Cull Off ZWrite Off
  186. Pass { // 0
  187. CGPROGRAM
  188. #pragma target 3.0
  189. #pragma vertex vert
  190. #pragma fragment fragFieldPreview
  191. ENDCG
  192. }
  193. Pass { // 1
  194. CGPROGRAM
  195. #pragma target 3.0
  196. #pragma vertex vert
  197. #pragma fragment fragIrisPreview
  198. ENDCG
  199. }
  200. Pass { // 2
  201. CGPROGRAM
  202. #pragma target 3.0
  203. #pragma vertex vert
  204. #pragma fragment fragField
  205. ENDCG
  206. }
  207. Pass { // 3
  208. CGPROGRAM
  209. #pragma target 3.0
  210. #pragma vertex vert
  211. #pragma fragment fragIris
  212. ENDCG
  213. }
  214. Pass { // 4
  215. CGPROGRAM
  216. #pragma target 3.0
  217. #pragma vertex vert
  218. #pragma fragment fragFieldHQ
  219. ENDCG
  220. }
  221. Pass { // 5
  222. CGPROGRAM
  223. #pragma target 3.0
  224. #pragma vertex vert
  225. #pragma fragment fragIrisHQ
  226. ENDCG
  227. }
  228. Pass { // 6
  229. CGPROGRAM
  230. #pragma target 3.0
  231. #pragma vertex vert
  232. #pragma fragment fragUpsample
  233. ENDCG
  234. }
  235. }
  236. Fallback off
  237. }