240 lines
8.5 KiB
C#
240 lines
8.5 KiB
C#
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;
|
|
}
|
|
}
|