| #include "ColorGrading.cginc" | 
|   | 
| // Grain | 
| half2 _Grain_Params1; // x: lum_contrib, y: intensity | 
| half4 _Grain_Params2; // x: xscale, h: yscale, z: xoffset, w: yoffset | 
| sampler2D _GrainTex; | 
|   | 
| // Dithering | 
| sampler2D _DitheringTex; | 
| float4 _DitheringCoords; | 
|   | 
| float3 UberSecondPass(half3 color, float2 uv) | 
| { | 
|     // Grain | 
|     #if GRAIN | 
|     { | 
|         float3 grain = tex2D(_GrainTex, uv * _Grain_Params2.xy + _Grain_Params2.zw).rgb; | 
|   | 
|         // Noisiness response curve based on scene luminance | 
|         float lum = 1.0 - sqrt(AcesLuminance(color)); | 
|         lum = lerp(1.0, lum, _Grain_Params1.x); | 
|   | 
|         color += color * grain * _Grain_Params1.y * lum; | 
|     } | 
|     #endif | 
|   | 
|     // Blue noise dithering  | 
|     #if DITHERING | 
|     { | 
|         // Symmetric triangular distribution on [-1,1] with maximal density at 0 | 
|         float noise = tex2D(_DitheringTex, uv * _DitheringCoords.xy + _DitheringCoords.zw).a * 2.0 - 1.0; | 
|         noise = sign(noise) * (1.0 - sqrt(1.0 - abs(noise))) / 255.0; | 
|   | 
|         color += noise; | 
|     } | 
|     #endif | 
|   | 
|     return color; | 
| } |