3 using Random = UnityEngine.Random;
5 namespace UnityStandardAssets.ImageEffects
8 [RequireComponent (typeof(Camera))]
9 [AddComponentMenu (
"Image Effects/Noise/Noise And Grain (Filmic)")]
13 public float intensityMultiplier = 0.25f;
15 public float generalIntensity = 0.5f;
16 public float blackIntensity = 1.0f;
17 public float whiteIntensity = 1.0f;
18 public float midGrey = 0.2f;
20 public bool dx11Grain =
false;
21 public float softness = 0.0f;
22 public bool monochrome =
false;
24 public Vector3 intensities =
new Vector3(1.0f, 1.0f, 1.0f);
25 public Vector3 tiling =
new Vector3(64.0f, 64.0f, 64.0f);
26 public float monochromeTiling = 64.0f;
28 public FilterMode filterMode = FilterMode.Bilinear;
30 public Texture2D noiseTexture;
32 public Shader noiseShader;
33 private Material noiseMaterial = null;
35 public Shader dx11NoiseShader;
36 private Material dx11NoiseMaterial = null;
38 private static float TILE_AMOUNT = 64.0f;
41 public override bool CheckResources ()
45 noiseMaterial = CheckShaderAndCreateMaterial (noiseShader, noiseMaterial);
47 if (dx11Grain && supportDX11)
50 dx11NoiseShader = Shader.Find(
"Hidden/NoiseAndGrainDX11");
52 dx11NoiseMaterial = CheckShaderAndCreateMaterial (dx11NoiseShader, dx11NoiseMaterial);
60 void OnRenderImage (RenderTexture source, RenderTexture destination)
62 if (CheckResources()==
false || (null==noiseTexture))
64 Graphics.Blit (source, destination);
65 if (null==noiseTexture) {
66 Debug.LogWarning(
"Noise & Grain effect failing as noise texture is not assigned. please assign.", transform);
71 softness = Mathf.Clamp(softness, 0.0f, 0.99f);
73 if (dx11Grain && supportDX11)
77 dx11NoiseMaterial.SetFloat(
"_DX11NoiseTime", Time.frameCount);
78 dx11NoiseMaterial.SetTexture (
"_NoiseTex", noiseTexture);
79 dx11NoiseMaterial.SetVector (
"_NoisePerChannel", monochrome ? Vector3.one : intensities);
80 dx11NoiseMaterial.SetVector (
"_MidGrey",
new Vector3(midGrey, 1.0f/(1.0f-midGrey), -1.0f/midGrey));
81 dx11NoiseMaterial.SetVector (
"_NoiseAmount",
new Vector3(generalIntensity, blackIntensity, whiteIntensity) * intensityMultiplier);
83 if (softness > Mathf.Epsilon)
85 RenderTexture rt = RenderTexture.GetTemporary((int) (source.width * (1.0f-softness)), (
int) (source.height * (1.0f-softness)));
86 DrawNoiseQuadGrid (source, rt, dx11NoiseMaterial, noiseTexture, monochrome ? 3 : 2);
87 dx11NoiseMaterial.SetTexture(
"_NoiseTex", rt);
88 Graphics.Blit(source, destination, dx11NoiseMaterial, 4);
89 RenderTexture.ReleaseTemporary(rt);
92 DrawNoiseQuadGrid (source, destination, dx11NoiseMaterial, noiseTexture, (monochrome ? 1 : 0));
99 noiseTexture.wrapMode = TextureWrapMode.Repeat;
100 noiseTexture.filterMode = filterMode;
103 noiseMaterial.SetTexture (
"_NoiseTex", noiseTexture);
104 noiseMaterial.SetVector (
"_NoisePerChannel", monochrome ? Vector3.one : intensities);
105 noiseMaterial.SetVector (
"_NoiseTilingPerChannel", monochrome ? Vector3.one * monochromeTiling : tiling);
106 noiseMaterial.SetVector (
"_MidGrey",
new Vector3(midGrey, 1.0f/(1.0f-midGrey), -1.0f/midGrey));
107 noiseMaterial.SetVector (
"_NoiseAmount",
new Vector3(generalIntensity, blackIntensity, whiteIntensity) * intensityMultiplier);
109 if (softness > Mathf.Epsilon)
111 RenderTexture rt2 = RenderTexture.GetTemporary((int) (source.width * (1.0f-softness)), (
int) (source.height * (1.0f-softness)));
112 DrawNoiseQuadGrid (source, rt2, noiseMaterial, noiseTexture, 2);
113 noiseMaterial.SetTexture(
"_NoiseTex", rt2);
114 Graphics.Blit(source, destination, noiseMaterial, 1);
115 RenderTexture.ReleaseTemporary(rt2);
118 DrawNoiseQuadGrid (source, destination, noiseMaterial, noiseTexture, 0);
122 static void DrawNoiseQuadGrid (RenderTexture source, RenderTexture dest, Material fxMaterial, Texture2D noise,
int passNr)
124 RenderTexture.active = dest;
126 float noiseSize = (noise.width * 1.0f);
127 float subDs = (1.0f * source.width) / TILE_AMOUNT;
129 fxMaterial.SetTexture (
"_MainTex", source);
134 float aspectCorrection = (1.0f * source.width) / (1.0f * source.height);
135 float stepSizeX = 1.0f / subDs;
136 float stepSizeY = stepSizeX * aspectCorrection;
137 float texTile = noiseSize / (noise.width * 1.0f);
139 fxMaterial.SetPass (passNr);
143 for (
float x1 = 0.0f; x1 < 1.0f; x1 += stepSizeX)
145 for (
float y1 = 0.0f; y1 < 1.0f; y1 += stepSizeY)
147 float tcXStart = Random.Range (0.0f, 1.0f);
148 float tcYStart = Random.Range (0.0f, 1.0f);
153 tcXStart = Mathf.Floor(tcXStart*noiseSize) / noiseSize;
154 tcYStart = Mathf.Floor(tcYStart*noiseSize) / noiseSize;
156 float texTileMod = 1.0f / noiseSize;
158 GL.MultiTexCoord2 (0, tcXStart, tcYStart);
159 GL.MultiTexCoord2 (1, 0.0f, 0.0f);
161 GL.Vertex3 (x1, y1, 0.1f);
162 GL.MultiTexCoord2 (0, tcXStart + texTile * texTileMod, tcYStart);
163 GL.MultiTexCoord2 (1, 1.0f, 0.0f);
165 GL.Vertex3 (x1 + stepSizeX, y1, 0.1f);
166 GL.MultiTexCoord2 (0, tcXStart + texTile * texTileMod, tcYStart + texTile * texTileMod);
167 GL.MultiTexCoord2 (1, 1.0f, 1.0f);
169 GL.Vertex3 (x1 + stepSizeX, y1 + stepSizeY, 0.1f);
170 GL.MultiTexCoord2 (0, tcXStart, tcYStart + texTile * texTileMod);
171 GL.MultiTexCoord2 (1, 0.0f, 1.0f);
173 GL.Vertex3 (x1, y1 + stepSizeY, 0.1f);