You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/Top Down/Standard Assets/Image Effects (Pro Only)/NoiseAndGrain.js

113 lines
3.7 KiB
JavaScript

2 months ago
#pragma strict
@script ExecuteInEditMode
@script RequireComponent (Camera)
@script AddComponentMenu ("Image Effects/Noise And Grain (Overlay)")
class NoiseAndGrain extends PostEffectsBase {
public var strength : float = 1.0f;
public var blackIntensity : float = 1.0f;
public var whiteIntensity : float = 1.0f;
public var redChannelNoise : float = 0.975f;
public var greenChannelNoise : float = 0.875f;
public var blueChannelNoise : float = 1.2f;
public var redChannelTiling : float = 24.0f;
public var greenChannelTiling : float = 28.0f;
public var blueChannelTiling : float = 34.0f;
public var filterMode : FilterMode = FilterMode.Bilinear;
public var noiseShader : Shader;
public var noiseTexture : Texture2D;
private var noiseMaterial : Material = null;
function OnDisable()
{
if (noiseMaterial)
DestroyImmediate(noiseMaterial);
}
function CheckResources () : boolean {
CheckSupport (false);
noiseMaterial = CheckShaderAndCreateMaterial (noiseShader, noiseMaterial);
if(!isSupported)
ReportAutoDisable ();
return isSupported;
}
function OnRenderImage (source : RenderTexture, destination : RenderTexture) {
if(CheckResources()==false) {
Graphics.Blit (source, destination);
return;
}
noiseMaterial.SetVector ("_NoisePerChannel", Vector3(redChannelNoise, greenChannelNoise, blueChannelNoise));
noiseMaterial.SetVector ("_NoiseTilingPerChannel", Vector3(redChannelTiling, greenChannelTiling, blueChannelTiling));
noiseMaterial.SetVector ("_NoiseAmount", Vector3(strength, blackIntensity, whiteIntensity));
noiseMaterial.SetTexture ("_NoiseTex", noiseTexture);
noiseTexture.filterMode = filterMode;
DrawNoiseQuadGrid (source, destination, noiseMaterial, noiseTexture, 0);
}
static function DrawNoiseQuadGrid (source : RenderTexture, dest : RenderTexture, fxMaterial : Material, noise : Texture2D, passNr : int) {
RenderTexture.active = dest;
var noiseSize : float = (noise.width * 1.0f);
var tileSize : float = noiseSize;
var subDs : float = (1.0f * source.width) / tileSize;
fxMaterial.SetTexture ("_MainTex", source);
GL.PushMatrix ();
GL.LoadOrtho ();
var aspectCorrection : float = (1.0f * source.width) / (1.0f * source.height);
var stepSizeX : float = 1.0f / subDs;
var stepSizeY : float = stepSizeX * aspectCorrection;
var texTile : float = tileSize / (noise.width * 1.0f);
fxMaterial.SetPass (passNr);
GL.Begin (GL.QUADS);
for (var x1 : float = 0.0; x1 < 1.0; x1 += stepSizeX) {
for (var y1 : float = 0.0; y1 < 1.0; y1 += stepSizeY) {
var tcXStart : float = Random.Range (0.0f, 1.0f);
var tcYStart : float = Random.Range (0.0f, 1.0f);
tcXStart = Mathf.Floor(tcXStart*noiseSize) / noiseSize;
tcYStart = Mathf.Floor(tcYStart*noiseSize) / noiseSize;
//var texTileMod : float = Mathf.Sign (Random.Range (-1.0f, 1.0f));
var texTileMod : float = 1.0f / noiseSize;
GL.MultiTexCoord2 (0, tcXStart, tcYStart);
GL.MultiTexCoord2 (1, 0.0f, 0.0f);
GL.Vertex3 (x1, y1, 0.1);
GL.MultiTexCoord2 (0, tcXStart + texTile * texTileMod, tcYStart);
GL.MultiTexCoord2 (1, 1.0f, 0.0f);
GL.Vertex3 (x1 + stepSizeX, y1, 0.1);
GL.MultiTexCoord2 (0, tcXStart + texTile * texTileMod, tcYStart + texTile * texTileMod);
GL.MultiTexCoord2 (1, 1.0f, 1.0f);
GL.Vertex3 (x1 + stepSizeX, y1 + stepSizeY, 0.1);
GL.MultiTexCoord2 (0, tcXStart, tcYStart + texTile * texTileMod);
GL.MultiTexCoord2 (1, 0.0f, 1.0f);
GL.Vertex3 (x1, y1 + stepSizeY, 0.1);
}
}
GL.End ();
GL.PopMatrix ();
}
}