| namespace UnityEngine.PostProcessing | 
| { | 
|     public sealed class GrainComponent : PostProcessingComponentRenderTexture<GrainModel> | 
|     { | 
|         static class Uniforms | 
|         { | 
|             internal static readonly int _Grain_Params1 = Shader.PropertyToID("_Grain_Params1"); | 
|             internal static readonly int _Grain_Params2 = Shader.PropertyToID("_Grain_Params2"); | 
|             internal static readonly int _GrainTex      = Shader.PropertyToID("_GrainTex"); | 
|             internal static readonly int _Phase         = Shader.PropertyToID("_Phase"); | 
|         } | 
|   | 
|         public override bool active | 
|         { | 
|             get | 
|             { | 
|                 return model.enabled | 
|                        && model.settings.intensity > 0f | 
|                        && SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.ARGBHalf) | 
|                        && !context.interrupted; | 
|             } | 
|         } | 
|   | 
|         RenderTexture m_GrainLookupRT; | 
|   | 
|         public override void OnDisable() | 
|         { | 
|             GraphicsUtils.Destroy(m_GrainLookupRT); | 
|             m_GrainLookupRT = null; | 
|         } | 
|   | 
|         public override void Prepare(Material uberMaterial) | 
|         { | 
|             var settings = model.settings; | 
|   | 
|             uberMaterial.EnableKeyword("GRAIN"); | 
|   | 
|             float rndOffsetX; | 
|             float rndOffsetY; | 
|   | 
| #if POSTFX_DEBUG_STATIC_GRAIN | 
|             // Chosen by a fair dice roll | 
|             float time = 4f; | 
|             rndOffsetX = 0f; | 
|             rndOffsetY = 0f; | 
| #else | 
|             float time = Time.realtimeSinceStartup; | 
|             rndOffsetX = Random.value; | 
|             rndOffsetY = Random.value; | 
| #endif | 
|   | 
|             // Generate the grain lut for the current frame first | 
|             if (m_GrainLookupRT == null || !m_GrainLookupRT.IsCreated()) | 
|             { | 
|                 GraphicsUtils.Destroy(m_GrainLookupRT); | 
|   | 
|                 m_GrainLookupRT = new RenderTexture(192, 192, 0, RenderTextureFormat.ARGBHalf) | 
|                 { | 
|                     filterMode = FilterMode.Bilinear, | 
|                     wrapMode = TextureWrapMode.Repeat, | 
|                     anisoLevel = 0, | 
|                     name = "Grain Lookup Texture" | 
|                 }; | 
|   | 
|                 m_GrainLookupRT.Create(); | 
|             } | 
|   | 
|             var grainMaterial = context.materialFactory.Get("Hidden/Post FX/Grain Generator"); | 
|             grainMaterial.SetFloat(Uniforms._Phase, time / 20f); | 
|   | 
|             Graphics.Blit((Texture)null, m_GrainLookupRT, grainMaterial, settings.colored ? 1 : 0); | 
|   | 
|             // Send everything to the uber shader | 
|             uberMaterial.SetTexture(Uniforms._GrainTex, m_GrainLookupRT); | 
|             uberMaterial.SetVector(Uniforms._Grain_Params1, new Vector2(settings.luminanceContribution, settings.intensity * 20f)); | 
|             uberMaterial.SetVector(Uniforms._Grain_Params2, new Vector4((float)context.width / (float)m_GrainLookupRT.width / settings.size, (float)context.height / (float)m_GrainLookupRT.height / settings.size, rndOffsetX, rndOffsetY)); | 
|         } | 
|     } | 
| } |