diff options
Diffstat (limited to 'Valheim_v0.141.2_r202102/Valheim/assembly_sunshafts/UnityStandardAssets.ImageEffects/NoiseAndGrain.cs')
-rw-r--r-- | Valheim_v0.141.2_r202102/Valheim/assembly_sunshafts/UnityStandardAssets.ImageEffects/NoiseAndGrain.cs | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/Valheim_v0.141.2_r202102/Valheim/assembly_sunshafts/UnityStandardAssets.ImageEffects/NoiseAndGrain.cs b/Valheim_v0.141.2_r202102/Valheim/assembly_sunshafts/UnityStandardAssets.ImageEffects/NoiseAndGrain.cs new file mode 100644 index 0000000..a15b96d --- /dev/null +++ b/Valheim_v0.141.2_r202102/Valheim/assembly_sunshafts/UnityStandardAssets.ImageEffects/NoiseAndGrain.cs @@ -0,0 +1,158 @@ +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects; + +[ExecuteInEditMode] +[RequireComponent(typeof(Camera))] +[AddComponentMenu("Image Effects/Noise/Noise And Grain (Filmic)")] +public class NoiseAndGrain : PostEffectsBase +{ + public float intensityMultiplier = 0.25f; + + public float generalIntensity = 0.5f; + + public float blackIntensity = 1f; + + public float whiteIntensity = 1f; + + public float midGrey = 0.2f; + + public bool dx11Grain; + + public float softness; + + public bool monochrome; + + public Vector3 intensities = new Vector3(1f, 1f, 1f); + + public Vector3 tiling = new Vector3(64f, 64f, 64f); + + public float monochromeTiling = 64f; + + public FilterMode filterMode = FilterMode.Bilinear; + + public Texture2D noiseTexture; + + public Shader noiseShader; + + private Material noiseMaterial; + + public Shader dx11NoiseShader; + + private Material dx11NoiseMaterial; + + private static float TILE_AMOUNT = 64f; + + public override bool CheckResources() + { + CheckSupport(needDepth: false); + noiseMaterial = CheckShaderAndCreateMaterial(noiseShader, noiseMaterial); + if (dx11Grain && supportDX11) + { + dx11NoiseMaterial = CheckShaderAndCreateMaterial(dx11NoiseShader, dx11NoiseMaterial); + } + if (!isSupported) + { + ReportAutoDisable(); + } + return isSupported; + } + + private void OnRenderImage(RenderTexture source, RenderTexture destination) + { + if (!CheckResources() || null == noiseTexture) + { + Graphics.Blit(source, destination); + if (null == noiseTexture) + { + Debug.LogWarning("Noise & Grain effect failing as noise texture is not assigned. please assign.", base.transform); + } + return; + } + softness = Mathf.Clamp(softness, 0f, 0.99f); + if (dx11Grain && supportDX11) + { + dx11NoiseMaterial.SetFloat("_DX11NoiseTime", Time.frameCount); + dx11NoiseMaterial.SetTexture("_NoiseTex", noiseTexture); + dx11NoiseMaterial.SetVector("_NoisePerChannel", monochrome ? Vector3.one : intensities); + dx11NoiseMaterial.SetVector("_MidGrey", new Vector3(midGrey, 1f / (1f - midGrey), -1f / midGrey)); + dx11NoiseMaterial.SetVector("_NoiseAmount", new Vector3(generalIntensity, blackIntensity, whiteIntensity) * intensityMultiplier); + if (softness > Mathf.Epsilon) + { + RenderTexture temporary = RenderTexture.GetTemporary((int)((float)source.width * (1f - softness)), (int)((float)source.height * (1f - softness))); + DrawNoiseQuadGrid(source, temporary, dx11NoiseMaterial, noiseTexture, monochrome ? 3 : 2); + dx11NoiseMaterial.SetTexture("_NoiseTex", temporary); + Graphics.Blit(source, destination, dx11NoiseMaterial, 4); + RenderTexture.ReleaseTemporary(temporary); + } + else + { + DrawNoiseQuadGrid(source, destination, dx11NoiseMaterial, noiseTexture, monochrome ? 1 : 0); + } + return; + } + if ((bool)noiseTexture) + { + noiseTexture.wrapMode = TextureWrapMode.Repeat; + noiseTexture.filterMode = filterMode; + } + noiseMaterial.SetTexture("_NoiseTex", noiseTexture); + noiseMaterial.SetVector("_NoisePerChannel", monochrome ? Vector3.one : intensities); + noiseMaterial.SetVector("_NoiseTilingPerChannel", monochrome ? (Vector3.one * monochromeTiling) : tiling); + noiseMaterial.SetVector("_MidGrey", new Vector3(midGrey, 1f / (1f - midGrey), -1f / midGrey)); + noiseMaterial.SetVector("_NoiseAmount", new Vector3(generalIntensity, blackIntensity, whiteIntensity) * intensityMultiplier); + if (softness > Mathf.Epsilon) + { + RenderTexture temporary2 = RenderTexture.GetTemporary((int)((float)source.width * (1f - softness)), (int)((float)source.height * (1f - softness))); + DrawNoiseQuadGrid(source, temporary2, noiseMaterial, noiseTexture, 2); + noiseMaterial.SetTexture("_NoiseTex", temporary2); + Graphics.Blit(source, destination, noiseMaterial, 1); + RenderTexture.ReleaseTemporary(temporary2); + } + else + { + DrawNoiseQuadGrid(source, destination, noiseMaterial, noiseTexture, 0); + } + } + + private static void DrawNoiseQuadGrid(RenderTexture source, RenderTexture dest, Material fxMaterial, Texture2D noise, int passNr) + { + RenderTexture.active = dest; + float num = (float)noise.width * 1f; + float num2 = 1f * (float)source.width / TILE_AMOUNT; + fxMaterial.SetTexture("_MainTex", source); + GL.PushMatrix(); + GL.LoadOrtho(); + float num3 = 1f * (float)source.width / (1f * (float)source.height); + float num4 = 1f / num2; + float num5 = num4 * num3; + float num6 = num / ((float)noise.width * 1f); + fxMaterial.SetPass(passNr); + GL.Begin(7); + for (float num7 = 0f; num7 < 1f; num7 += num4) + { + for (float num8 = 0f; num8 < 1f; num8 += num5) + { + float num9 = Random.Range(0f, 1f); + float num10 = Random.Range(0f, 1f); + num9 = Mathf.Floor(num9 * num) / num; + num10 = Mathf.Floor(num10 * num) / num; + float num11 = 1f / num; + GL.MultiTexCoord2(0, num9, num10); + GL.MultiTexCoord2(1, 0f, 0f); + GL.Vertex3(num7, num8, 0.1f); + GL.MultiTexCoord2(0, num9 + num6 * num11, num10); + GL.MultiTexCoord2(1, 1f, 0f); + GL.Vertex3(num7 + num4, num8, 0.1f); + GL.MultiTexCoord2(0, num9 + num6 * num11, num10 + num6 * num11); + GL.MultiTexCoord2(1, 1f, 1f); + GL.Vertex3(num7 + num4, num8 + num5, 0.1f); + GL.MultiTexCoord2(0, num9, num10 + num6 * num11); + GL.MultiTexCoord2(1, 0f, 1f); + GL.Vertex3(num7, num8 + num5, 0.1f); + } + } + GL.End(); + GL.PopMatrix(); + } +} |