HBAO.shader 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. Shader "Hidden/HBAO"
  2. {
  3. Properties {
  4. _MainTex ("", any) = "" {}
  5. _HBAOTex ("", any) = "" {}
  6. _TempTex("", any) = "" {}
  7. _NoiseTex("", 2D) = "" {}
  8. _DepthTex("", any) = "" {}
  9. _NormalsTex("", any) = "" {}
  10. }
  11. CGINCLUDE
  12. #pragma target 3.0
  13. #pragma editor_sync_compilation
  14. #include "UnityCG.cginc"
  15. UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
  16. UNITY_DECLARE_SCREENSPACE_TEXTURE(_HBAOTex);
  17. UNITY_DECLARE_SCREENSPACE_TEXTURE(_TempTex);
  18. UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);
  19. UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraGBufferTexture0); // diffuse color (RGB), occlusion (A)
  20. UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraGBufferTexture2); // normal (rgb), --unused-- (a)
  21. UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraMotionVectorsTexture);
  22. UNITY_DECLARE_SCREENSPACE_TEXTURE(_NormalsTex);
  23. UNITY_DECLARE_TEX2D(_NoiseTex);
  24. UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);
  25. UNITY_DECLARE_DEPTH_TEXTURE(_DepthTex);
  26. CBUFFER_START(FrequentlyUpdatedUniforms)
  27. float4 _Input_TexelSize;
  28. float4 _AO_TexelSize;
  29. float4 _DeinterleavedAO_TexelSize;
  30. float4 _ReinterleavedAO_TexelSize;
  31. float4 _TargetScale;
  32. float4 _UVToView;
  33. float4x4 _WorldToCameraMatrix;
  34. float _Radius;
  35. float _MaxRadiusPixels;
  36. float _NegInvRadius2;
  37. float _AngleBias;
  38. float _AOmultiplier;
  39. float _Intensity;
  40. half4 _BaseColor;
  41. float _MultiBounceInfluence;
  42. float _OffscreenSamplesContrib;
  43. float _MaxDistance;
  44. float _DistanceFalloff;
  45. float _BlurSharpness;
  46. float _ColorBleedSaturation;
  47. float _AlbedoMultiplier;
  48. float _ColorBleedBrightnessMask;
  49. float2 _ColorBleedBrightnessMaskRange;
  50. float2 _TemporalParams;
  51. CBUFFER_END
  52. CBUFFER_START(PerPassUpdatedUniforms)
  53. float4 _UVTransform;
  54. float2 _BlurDeltaUV;
  55. CBUFFER_END
  56. CBUFFER_START(PerPassUpdatedDeinterleavingUniforms)
  57. float2 _Deinterleave_Offset00;
  58. float2 _Deinterleave_Offset10;
  59. float2 _Deinterleave_Offset01;
  60. float2 _Deinterleave_Offset11;
  61. float2 _AtlasOffset;
  62. float2 _Jitter;
  63. CBUFFER_END
  64. struct Attributes
  65. {
  66. float3 vertex : POSITION;
  67. UNITY_VERTEX_INPUT_INSTANCE_ID
  68. };
  69. struct Varyings
  70. {
  71. float4 vertex : SV_POSITION;
  72. float2 uv : TEXCOORD0;
  73. //float2 uvStereo : TEXCOORD1;
  74. //#if STEREO_INSTANCING_ENABLED
  75. //uint stereoTargetEyeIndex : SV_RenderTargetArrayIndex;
  76. //#endif
  77. UNITY_VERTEX_OUTPUT_STEREO
  78. };
  79. float2 TransformTriangleVertexToUV(float2 vertex)
  80. {
  81. float2 uv = (vertex + 1.0) * 0.5;
  82. return uv;
  83. }
  84. Varyings Vert_Default(Attributes input)
  85. {
  86. Varyings o;
  87. UNITY_SETUP_INSTANCE_ID(input);
  88. UNITY_INITIALIZE_OUTPUT(Varyings, o);
  89. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
  90. o.vertex = float4(input.vertex.xy, 0.0, 1.0);
  91. o.uv = TransformTriangleVertexToUV(input.vertex.xy);
  92. #if UNITY_UV_STARTS_AT_TOP
  93. o.uv = o.uv * float2(1.0, -1.0) + float2(0.0, 1.0);
  94. #endif
  95. //o.uvStereo = TransformStereoScreenSpaceTex(o.uv, 1.0);
  96. o.uv = TransformStereoScreenSpaceTex(o.uv, 1.0);
  97. return o;
  98. }
  99. Varyings Vert_Atlas(Attributes input)
  100. {
  101. Varyings o;
  102. UNITY_SETUP_INSTANCE_ID(input);
  103. UNITY_INITIALIZE_OUTPUT(Varyings, o);
  104. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
  105. o.vertex = float4((input.vertex.xy + float2(-3.0, 1.0)) * (_DeinterleavedAO_TexelSize.zw / _ReinterleavedAO_TexelSize.zw) + 2.0 * _AtlasOffset * _ReinterleavedAO_TexelSize.xy, 0.0, 1.0);
  106. o.uv = TransformTriangleVertexToUV(input.vertex.xy);
  107. // flip triangle upside down
  108. o.vertex.y = 1 - o.vertex.y;
  109. //o.uvStereo = TransformStereoScreenSpaceTex(o.uv, 1.0);
  110. o.uv = TransformStereoScreenSpaceTex(o.uv, 1.0);
  111. return o;
  112. }
  113. Varyings Vert_UVTransform(Attributes input)
  114. {
  115. Varyings o;
  116. UNITY_SETUP_INSTANCE_ID(input);
  117. UNITY_INITIALIZE_OUTPUT(Varyings, o);
  118. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
  119. o.vertex = float4(input.vertex.xy, 0.0, 1.0);
  120. o.uv = TransformTriangleVertexToUV(input.vertex.xy) * _UVTransform.xy + _UVTransform.zw;
  121. //o.uvStereo = TransformStereoScreenSpaceTex(o.uv, 1.0);
  122. o.uv = TransformStereoScreenSpaceTex(o.uv, 1.0);
  123. //#if STEREO_INSTANCING_ENABLED
  124. //o.stereoTargetEyeIndex = (uint)_DepthSlice;
  125. //#endif
  126. return o;
  127. }
  128. ENDCG
  129. SubShader {
  130. LOD 100
  131. ZTest Always Cull Off ZWrite Off
  132. // 0
  133. Pass {
  134. Name "HBAO - AO"
  135. CGPROGRAM
  136. #pragma multi_compile_local __ DEFERRED_SHADING ORTHOGRAPHIC_PROJECTION
  137. #pragma multi_compile_local __ COLOR_BLEEDING
  138. #pragma multi_compile_local __ OFFSCREEN_SAMPLES_CONTRIBUTION
  139. #pragma multi_compile_local __ NORMALS_CAMERA NORMALS_RECONSTRUCT
  140. #pragma multi_compile_local __ INTERLEAVED_GRADIENT_NOISE
  141. #pragma multi_compile_local QUALITY_LOWEST QUALITY_LOW QUALITY_MEDIUM QUALITY_HIGH QUALITY_HIGHEST
  142. #if QUALITY_LOWEST
  143. #define DIRECTIONS 3
  144. #define STEPS 2
  145. #elif QUALITY_LOW
  146. #define DIRECTIONS 4
  147. #define STEPS 3
  148. #elif QUALITY_MEDIUM
  149. #define DIRECTIONS 6
  150. #define STEPS 4
  151. #elif QUALITY_HIGH
  152. #define DIRECTIONS 8
  153. #define STEPS 4
  154. #elif QUALITY_HIGHEST
  155. #define DIRECTIONS 8
  156. #define STEPS 6
  157. #else
  158. #define DIRECTIONS 1
  159. #define STEPS 1
  160. #endif
  161. #pragma vertex Vert_Default
  162. #pragma fragment AO_Frag
  163. #include "HBAO_AO.cginc"
  164. ENDCG
  165. }
  166. // 1
  167. Pass {
  168. Name "HBAO - AO Deinterleaved"
  169. CGPROGRAM
  170. #pragma multi_compile_local __ DEFERRED_SHADING ORTHOGRAPHIC_PROJECTION
  171. #pragma multi_compile_local __ COLOR_BLEEDING
  172. #pragma multi_compile_local __ OFFSCREEN_SAMPLES_CONTRIBUTION
  173. #pragma multi_compile_local QUALITY_LOWEST QUALITY_LOW QUALITY_MEDIUM QUALITY_HIGH QUALITY_HIGHEST
  174. #if QUALITY_LOWEST
  175. #define DIRECTIONS 3
  176. #define STEPS 2
  177. #elif QUALITY_LOW
  178. #define DIRECTIONS 4
  179. #define STEPS 3
  180. #elif QUALITY_MEDIUM
  181. #define DIRECTIONS 6
  182. #define STEPS 4
  183. #elif QUALITY_HIGH
  184. #define DIRECTIONS 8
  185. #define STEPS 4
  186. #elif QUALITY_HIGHEST
  187. #define DIRECTIONS 8
  188. #define STEPS 6
  189. #else
  190. #define DIRECTIONS 1
  191. #define STEPS 1
  192. #endif
  193. #define DEINTERLEAVED
  194. #pragma vertex Vert_Default
  195. #pragma fragment AO_Frag
  196. #include "HBAO_AO.cginc"
  197. ENDCG
  198. }
  199. // 2
  200. Pass {
  201. Name "HBAO - Deinterleave Depth"
  202. CGPROGRAM
  203. #pragma vertex Vert_Default
  204. #pragma fragment DeinterleaveDepth_Frag
  205. #include "HBAO_Deinterleaving.cginc"
  206. ENDCG
  207. }
  208. // 3
  209. Pass {
  210. Name "HBAO - Deinterleave Normals"
  211. CGPROGRAM
  212. #pragma multi_compile_local __ ORTHOGRAPHIC_PROJECTION
  213. #pragma multi_compile_local __ NORMALS_CAMERA NORMALS_RECONSTRUCT
  214. #pragma vertex Vert_Default
  215. #pragma fragment DeinterleaveNormals_Frag
  216. #include "HBAO_Deinterleaving.cginc"
  217. ENDCG
  218. }
  219. // 4
  220. Pass {
  221. Name "HBAO - Atlas Deinterleaved AO"
  222. CGPROGRAM
  223. #pragma vertex Vert_Atlas
  224. #pragma fragment Frag
  225. half4 Frag(Varyings input) : SV_Target
  226. {
  227. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  228. return UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, input.uv);
  229. }
  230. ENDCG
  231. }
  232. // 5
  233. Pass {
  234. Name "HBAO - Reinterleave AO"
  235. CGPROGRAM
  236. #pragma vertex Vert_UVTransform
  237. #pragma fragment ReinterleaveAO_Frag
  238. #include "HBAO_Deinterleaving.cginc"
  239. ENDCG
  240. }
  241. // 6
  242. Pass {
  243. Name "HBAO - Blur"
  244. CGPROGRAM
  245. #pragma multi_compile_local __ ORTHOGRAPHIC_PROJECTION
  246. #pragma multi_compile_local __ COLOR_BLEEDING
  247. #pragma multi_compile_local BLUR_RADIUS_2 BLUR_RADIUS_3 BLUR_RADIUS_4 BLUR_RADIUS_5
  248. #if BLUR_RADIUS_2
  249. #define KERNEL_RADIUS 2
  250. #elif BLUR_RADIUS_3
  251. #define KERNEL_RADIUS 3
  252. #elif BLUR_RADIUS_4
  253. #define KERNEL_RADIUS 4
  254. #elif BLUR_RADIUS_5
  255. #define KERNEL_RADIUS 5
  256. #endif
  257. #pragma vertex Vert_Default
  258. #pragma fragment Blur_Frag
  259. #include "HBAO_Blur.cginc"
  260. ENDCG
  261. }
  262. // 7
  263. Pass {
  264. Name "HBAO - Temporal Filter"
  265. CGPROGRAM
  266. #pragma multi_compile_local __ COLOR_BLEEDING
  267. #pragma multi_compile_local __ VARIANCE_CLIPPING_4TAP VARIANCE_CLIPPING_8TAP
  268. #pragma vertex Vert_Default
  269. #pragma fragment TemporalFilter_Frag
  270. #include "HBAO_TemporalFilter.cginc"
  271. ENDCG
  272. }
  273. // 8
  274. Pass {
  275. Name "HBAO - Copy"
  276. CGPROGRAM
  277. #pragma vertex Vert_Default
  278. #pragma fragment Frag
  279. half4 Frag(Varyings input) : SV_Target
  280. {
  281. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  282. return UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, input.uv);
  283. }
  284. ENDCG
  285. }
  286. // 9
  287. Pass {
  288. Name "HBAO - Composite"
  289. ColorMask RGB
  290. CGPROGRAM
  291. #pragma multi_compile_local __ COLOR_BLEEDING
  292. #pragma multi_compile_local __ MULTIBOUNCE
  293. #pragma multi_compile_local __ DEBUG_AO DEBUG_COLORBLEEDING DEBUG_NOAO_AO DEBUG_AO_AOONLY DEBUG_NOAO_AOONLY
  294. #pragma vertex Vert_UVTransform
  295. #pragma fragment Composite_Frag
  296. #include "HBAO_Composite.cginc"
  297. ENDCG
  298. }
  299. // 10
  300. Pass {
  301. Name "HBAO - Composite AfterLighting"
  302. CGPROGRAM
  303. #pragma multi_compile_local __ COLOR_BLEEDING
  304. #pragma multi_compile_local __ MULTIBOUNCE
  305. #pragma multi_compile_local __ LIGHTING_LOG_ENCODED
  306. #pragma vertex Vert_Default
  307. #pragma fragment Composite_Frag
  308. #include "HBAO_Composite.cginc"
  309. ENDCG
  310. }
  311. // 11
  312. Pass {
  313. Name "HBAO - Composite BeforeReflections"
  314. CGPROGRAM
  315. #pragma multi_compile_local __ COLOR_BLEEDING
  316. #pragma multi_compile_local __ LIGHTING_LOG_ENCODED
  317. #pragma vertex Vert_Default
  318. #pragma fragment Composite_Lit_Frag
  319. #include "HBAO_Composite.cginc"
  320. ENDCG
  321. }
  322. // 12
  323. Pass {
  324. Name "HBAO - Debug ViewNormals"
  325. ColorMask RGB
  326. CGPROGRAM
  327. #pragma multi_compile_local __ ORTHOGRAPHIC_PROJECTION
  328. #pragma multi_compile_local __ NORMALS_CAMERA NORMALS_RECONSTRUCT
  329. #pragma vertex Vert_UVTransform
  330. #pragma fragment AO_Frag
  331. #define DIRECTIONS 1
  332. #define STEPS 1
  333. #define DEBUG_VIEWNORMALS
  334. #include "HBAO_AO.cginc"
  335. ENDCG
  336. }
  337. }
  338. FallBack off
  339. }