using System; using UnityEngine; namespace UnityStandardAssets.ImageEffects { // Token: 0x02000076 RID: 118 [ExecuteInEditMode] [RequireComponent(typeof(Camera))] [AddComponentMenu("Image Effects/Noise/Noise And Grain (Filmic)")] public class NoiseAndGrain : PostEffectsBase { // Token: 0x0600014D RID: 333 RVA: 0x0000EA74 File Offset: 0x0000CE74 private void Awake() { this.mesh = new Mesh(); } // Token: 0x0600014E RID: 334 RVA: 0x0000EA84 File Offset: 0x0000CE84 public override bool CheckResources() { base.CheckSupport(false); this.noiseMaterial = base.CheckShaderAndCreateMaterial(this.noiseShader, this.noiseMaterial); if (this.dx11Grain && this.supportDX11) { this.dx11NoiseMaterial = base.CheckShaderAndCreateMaterial(this.dx11NoiseShader, this.dx11NoiseMaterial); } if (!this.isSupported) { base.ReportAutoDisable(); } return this.isSupported; } // Token: 0x0600014F RID: 335 RVA: 0x0000EAF8 File Offset: 0x0000CEF8 private void OnRenderImage(RenderTexture source, RenderTexture destination) { if (!this.CheckResources() || null == this.noiseTexture) { Graphics.Blit(source, destination); if (null == this.noiseTexture) { Debug.LogWarning("Noise & Grain effect failing as noise texture is not assigned. please assign.", base.transform); } return; } this.softness = Mathf.Clamp(this.softness, 0f, 0.99f); if (this.dx11Grain && this.supportDX11) { this.dx11NoiseMaterial.SetFloat("_DX11NoiseTime", (float)Time.frameCount); this.dx11NoiseMaterial.SetTexture("_NoiseTex", this.noiseTexture); this.dx11NoiseMaterial.SetVector("_NoisePerChannel", (!this.monochrome) ? this.intensities : Vector3.one); this.dx11NoiseMaterial.SetVector("_MidGrey", new Vector3(this.midGrey, 1f / (1f - this.midGrey), -1f / this.midGrey)); this.dx11NoiseMaterial.SetVector("_NoiseAmount", new Vector3(this.generalIntensity, this.blackIntensity, this.whiteIntensity) * this.intensityMultiplier); if (this.softness > Mathf.Epsilon) { RenderTexture temporary = RenderTexture.GetTemporary((int)((float)source.width * (1f - this.softness)), (int)((float)source.height * (1f - this.softness))); NoiseAndGrain.DrawNoiseQuadGrid(source, temporary, this.dx11NoiseMaterial, this.noiseTexture, this.mesh, (!this.monochrome) ? 2 : 3); this.dx11NoiseMaterial.SetTexture("_NoiseTex", temporary); Graphics.Blit(source, destination, this.dx11NoiseMaterial, 4); RenderTexture.ReleaseTemporary(temporary); } else { NoiseAndGrain.DrawNoiseQuadGrid(source, destination, this.dx11NoiseMaterial, this.noiseTexture, this.mesh, (!this.monochrome) ? 0 : 1); } } else { if (this.noiseTexture) { this.noiseTexture.wrapMode = TextureWrapMode.Repeat; this.noiseTexture.filterMode = this.filterMode; } this.noiseMaterial.SetTexture("_NoiseTex", this.noiseTexture); this.noiseMaterial.SetVector("_NoisePerChannel", (!this.monochrome) ? this.intensities : Vector3.one); this.noiseMaterial.SetVector("_NoiseTilingPerChannel", (!this.monochrome) ? this.tiling : (Vector3.one * this.monochromeTiling)); this.noiseMaterial.SetVector("_MidGrey", new Vector3(this.midGrey, 1f / (1f - this.midGrey), -1f / this.midGrey)); this.noiseMaterial.SetVector("_NoiseAmount", new Vector3(this.generalIntensity, this.blackIntensity, this.whiteIntensity) * this.intensityMultiplier); if (this.softness > Mathf.Epsilon) { RenderTexture temporary2 = RenderTexture.GetTemporary((int)((float)source.width * (1f - this.softness)), (int)((float)source.height * (1f - this.softness))); NoiseAndGrain.DrawNoiseQuadGrid(source, temporary2, this.noiseMaterial, this.noiseTexture, this.mesh, 2); this.noiseMaterial.SetTexture("_NoiseTex", temporary2); Graphics.Blit(source, destination, this.noiseMaterial, 1); RenderTexture.ReleaseTemporary(temporary2); } else { NoiseAndGrain.DrawNoiseQuadGrid(source, destination, this.noiseMaterial, this.noiseTexture, this.mesh, 0); } } } // Token: 0x06000150 RID: 336 RVA: 0x0000EED4 File Offset: 0x0000D2D4 private static void DrawNoiseQuadGrid(RenderTexture source, RenderTexture dest, Material fxMaterial, Texture2D noise, Mesh mesh, int passNr) { RenderTexture.active = dest; fxMaterial.SetTexture("_MainTex", source); GL.PushMatrix(); GL.LoadOrtho(); fxMaterial.SetPass(passNr); NoiseAndGrain.BuildMesh(mesh, source, noise); Transform transform = Camera.main.transform; Vector3 position = transform.position; Quaternion rotation = transform.rotation; transform.position = Vector3.zero; transform.rotation = Quaternion.identity; Graphics.DrawMeshNow(mesh, Matrix4x4.identity); transform.position = position; transform.rotation = rotation; GL.PopMatrix(); } // Token: 0x06000151 RID: 337 RVA: 0x0000EF60 File Offset: 0x0000D360 private static void BuildMesh(Mesh mesh, RenderTexture source, Texture2D noise) { float num = (float)noise.width * 1f; float num2 = 1f * (float)source.width / NoiseAndGrain.TILE_AMOUNT; float num3 = 1f * (float)source.width / (1f * (float)source.height); float num4 = 1f / num2; float num5 = num4 * num3; int num6 = (int)Mathf.Ceil(num2); int num7 = (int)Mathf.Ceil(1f / num5); if (mesh.vertices.Length != num6 * num7 * 4) { Vector3[] array = new Vector3[num6 * num7 * 4]; Vector2[] array2 = new Vector2[num6 * num7 * 4]; int[] array3 = new int[num6 * num7 * 6]; int num8 = 0; int num9 = 0; for (float num10 = 0f; num10 < 1f; num10 += num4) { for (float num11 = 0f; num11 < 1f; num11 += num5) { array[num8] = new Vector3(num10, num11, 0.1f); array[num8 + 1] = new Vector3(num10 + num4, num11, 0.1f); array[num8 + 2] = new Vector3(num10 + num4, num11 + num5, 0.1f); array[num8 + 3] = new Vector3(num10, num11 + num5, 0.1f); array2[num8] = new Vector2(0f, 0f); array2[num8 + 1] = new Vector2(1f, 0f); array2[num8 + 2] = new Vector2(1f, 1f); array2[num8 + 3] = new Vector2(0f, 1f); array3[num9] = num8; array3[num9 + 1] = num8 + 1; array3[num9 + 2] = num8 + 2; array3[num9 + 3] = num8; array3[num9 + 4] = num8 + 2; array3[num9 + 5] = num8 + 3; num8 += 4; num9 += 6; } } mesh.vertices = array; mesh.uv2 = array2; mesh.triangles = array3; } NoiseAndGrain.BuildMeshUV0(mesh, num6, num7, num, noise.width); } // Token: 0x06000152 RID: 338 RVA: 0x0000F1C0 File Offset: 0x0000D5C0 private static void BuildMeshUV0(Mesh mesh, int width, int height, float noiseSize, int noiseWidth) { float num = noiseSize / ((float)noiseWidth * 1f); float num2 = 1f / noiseSize; Vector2[] array = new Vector2[width * height * 4]; int num3 = 0; for (int i = 0; i < width * height; i++) { float num4 = global::UnityEngine.Random.Range(0f, noiseSize); float num5 = global::UnityEngine.Random.Range(0f, noiseSize); num4 = Mathf.Floor(num4) * num2; num5 = Mathf.Floor(num5) * num2; array[num3] = new Vector2(num4, num5); array[num3 + 1] = new Vector2(num4 + num * num2, num5); array[num3 + 2] = new Vector2(num4 + num * num2, num5 + num * num2); array[num3 + 3] = new Vector2(num4, num5 + num * num2); num3 += 4; } mesh.uv = array; } // Token: 0x040002D5 RID: 725 public float intensityMultiplier = 0.25f; // Token: 0x040002D6 RID: 726 public float generalIntensity = 0.5f; // Token: 0x040002D7 RID: 727 public float blackIntensity = 1f; // Token: 0x040002D8 RID: 728 public float whiteIntensity = 1f; // Token: 0x040002D9 RID: 729 public float midGrey = 0.2f; // Token: 0x040002DA RID: 730 public bool dx11Grain; // Token: 0x040002DB RID: 731 public float softness; // Token: 0x040002DC RID: 732 public bool monochrome; // Token: 0x040002DD RID: 733 public Vector3 intensities = new Vector3(1f, 1f, 1f); // Token: 0x040002DE RID: 734 public Vector3 tiling = new Vector3(64f, 64f, 64f); // Token: 0x040002DF RID: 735 public float monochromeTiling = 64f; // Token: 0x040002E0 RID: 736 public FilterMode filterMode = FilterMode.Bilinear; // Token: 0x040002E1 RID: 737 public Texture2D noiseTexture; // Token: 0x040002E2 RID: 738 public Shader noiseShader; // Token: 0x040002E3 RID: 739 private Material noiseMaterial; // Token: 0x040002E4 RID: 740 public Shader dx11NoiseShader; // Token: 0x040002E5 RID: 741 private Material dx11NoiseMaterial; // Token: 0x040002E6 RID: 742 private static float TILE_AMOUNT = 64f; // Token: 0x040002E7 RID: 743 private Mesh mesh; } }