using System; namespace UnityEngine.PostProcessing { public sealed class GrainComponent : PostProcessingComponentRenderTexture { public override bool active { get { return base.model.enabled && base.model.settings.intensity > 0f && SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.ARGBHalf) && !this.context.interrupted; } } public override void OnDisable() { GraphicsUtils.Destroy(this.m_GrainLookupRT); this.m_GrainLookupRT = null; } public override void Prepare(Material uberMaterial) { GrainModel.Settings settings = base.model.settings; uberMaterial.EnableKeyword("GRAIN"); float realtimeSinceStartup = Time.realtimeSinceStartup; float value = Random.value; float value2 = Random.value; if (this.m_GrainLookupRT == null || !this.m_GrainLookupRT.IsCreated()) { GraphicsUtils.Destroy(this.m_GrainLookupRT); this.m_GrainLookupRT = new RenderTexture(192, 192, 0, RenderTextureFormat.ARGBHalf) { filterMode = FilterMode.Bilinear, wrapMode = TextureWrapMode.Repeat, anisoLevel = 0, name = "Grain Lookup Texture" }; this.m_GrainLookupRT.Create(); } Material material = this.context.materialFactory.Get("Hidden/Post FX/Grain Generator"); material.SetFloat(GrainComponent.Uniforms._Phase, realtimeSinceStartup / 20f); Graphics.Blit(null, this.m_GrainLookupRT, material, (!settings.colored) ? 0 : 1); uberMaterial.SetTexture(GrainComponent.Uniforms._GrainTex, this.m_GrainLookupRT); uberMaterial.SetVector(GrainComponent.Uniforms._Grain_Params1, new Vector2(settings.luminanceContribution, settings.intensity * 20f)); uberMaterial.SetVector(GrainComponent.Uniforms._Grain_Params2, new Vector4((float)this.context.width / (float)this.m_GrainLookupRT.width / settings.size, (float)this.context.height / (float)this.m_GrainLookupRT.height / settings.size, value, value2)); } private RenderTexture m_GrainLookupRT; private 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"); } } }