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.
113 lines
3.7 KiB
JavaScript
113 lines
3.7 KiB
JavaScript
1 month 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 ();
|
||
|
}
|
||
|
}
|