| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 | 
							- using System;
 
- using UnityEngine;
 
- [ExecuteInEditMode]
 
- [RequireComponent (typeof(Camera))]
 
- [AddComponentMenu ("Image Effects/Rendering/UnderWater Fog")]
 
- public class UnderWaterFog : MonoBehaviour
 
- {
 
- 	public Color fogColor = Color.white;
 
- 	[Tooltip("Fog top Y coordinate")]
 
- 	public float height = 1.0f;
 
- 	[Range(0.001f,10.0f)]
 
- 	public float heightDensity = 2.0f;
 
- 	[Tooltip("Push fog away from the camera by this amount")]
 
- 	public float startDistance = 0.0f;
 
- 	public Shader fogShader = null;
 
- 	private Material fogMaterial = null;
 
- 	void OnEnable (){
 
- 		CheckResources ();
 
- 	}
 
- 	public bool CheckResources ()
 
- 	{
 
- 		if (fogShader == null) {
 
- 			fogShader = Shader.Find ("Hidden/UnderWaterFog");
 
- 		}
 
- 		if (fogMaterial == null) {
 
- 			fogMaterial = new Material (fogShader);
 
- 		}
 
- 		bool isSupported = true;
 
- 		if (!SystemInfo.SupportsRenderTextureFormat (RenderTextureFormat.Depth))
 
- 		{
 
- 			return false;
 
- 		}
 
- 		GetComponent<Camera>().depthTextureMode |= DepthTextureMode.Depth;
 
- 		return isSupported;
 
- 	}
 
- 	[ImageEffectOpaque]
 
- 	void OnRenderImage (RenderTexture source, RenderTexture destination)
 
- 	{
 
- 		if (CheckResources()==false)
 
- 		{
 
- 			Graphics.Blit (source, destination);
 
- 			return;
 
- 		}
 
- 		Camera cam = GetComponent<Camera>();
 
- 		Transform camtr = cam.transform;
 
- 		float camNear = cam.nearClipPlane;
 
- 		float camFar = cam.farClipPlane;
 
- 		float camFov = cam.fieldOfView;
 
- 		float camAspect = cam.aspect;
 
- 		Matrix4x4 frustumCorners = Matrix4x4.identity;
 
- 		float fovWHalf = camFov * 0.5f;
 
- 		Vector3 toRight = camtr.right * camNear * Mathf.Tan (fovWHalf * Mathf.Deg2Rad) * camAspect;
 
- 		Vector3 toTop = camtr.up * camNear * Mathf.Tan (fovWHalf * Mathf.Deg2Rad);
 
- 		Vector3 topLeft = (camtr.forward * camNear - toRight + toTop);
 
- 		float camScale = topLeft.magnitude * camFar/camNear;
 
- 		topLeft.Normalize();
 
- 		topLeft *= camScale;
 
- 		Vector3 topRight = (camtr.forward * camNear + toRight + toTop);
 
- 		topRight.Normalize();
 
- 		topRight *= camScale;
 
- 		Vector3 bottomRight = (camtr.forward * camNear + toRight - toTop);
 
- 		bottomRight.Normalize();
 
- 		bottomRight *= camScale;
 
- 		Vector3 bottomLeft = (camtr.forward * camNear - toRight - toTop);
 
- 		bottomLeft.Normalize();
 
- 		bottomLeft *= camScale;
 
- 		frustumCorners.SetRow (0, topLeft);
 
- 		frustumCorners.SetRow (1, topRight);
 
- 		frustumCorners.SetRow (2, bottomRight);
 
- 		frustumCorners.SetRow (3, bottomLeft);
 
- 		var camPos= camtr.position;
 
- 		float FdotC = camPos.y-height;
 
- 		float paramK = (FdotC <= 0.0f ? 1.0f : 0.0f);
 
- 		fogMaterial.SetColor ("_Color", fogColor);
 
- 		fogMaterial.SetMatrix ("_FrustumCornersWS", frustumCorners);
 
- 		fogMaterial.SetVector ("_CameraWS", camPos);
 
- 		fogMaterial.SetVector ("_HeightParams", new Vector4 (height, FdotC, paramK, heightDensity*0.5f));
 
- 		fogMaterial.SetVector ("_DistanceParams", new Vector4 (-Mathf.Max(startDistance,0.0f), 1.0f, 0, 0));
 
- 		var sceneMode= RenderSettings.fogMode;
 
- 		var sceneDensity = heightDensity;//RenderSettings.fogDensity;
 
- 		var sceneStart= RenderSettings.fogStartDistance;
 
- 		var sceneEnd= RenderSettings.fogEndDistance;
 
- 		Vector4 sceneParams;
 
- 		bool  linear = (sceneMode == FogMode.Linear);
 
- 		float diff = linear ? sceneEnd - sceneStart : 0.0f;
 
- 		float invDiff = Mathf.Abs(diff) > 0.0001f ? 1.0f / diff : 0.0f;
 
- 		sceneParams.x = sceneDensity * 1.2011224087f; // density / sqrt(ln(2)), used by Exp2 fog mode
 
- 		sceneParams.y = sceneDensity * 1.4426950408f; // density / ln(2), used by Exp fog mode
 
- 		sceneParams.z = linear ? -invDiff : 0.0f;
 
- 		sceneParams.w = linear ? sceneEnd * invDiff : 0.0f;
 
- 		fogMaterial.SetVector ("_SceneFogParams", sceneParams);
 
- 		fogMaterial.SetVector ("_SceneFogMode", new Vector4((int)sceneMode,0 , 0, 0));
 
- 		CustomGraphicsBlit (source, destination, fogMaterial, 0);
 
- 	}
 
- 	static void CustomGraphicsBlit (RenderTexture source, RenderTexture dest, Material fxMaterial, int passNr)
 
- 	{
 
- 		RenderTexture.active = dest;
 
- 		fxMaterial.SetTexture ("_MainTex", source);
 
- 		GL.PushMatrix ();
 
- 		GL.LoadOrtho ();
 
- 		fxMaterial.SetPass (passNr);
 
- 		GL.Begin (GL.QUADS);
 
- 		GL.MultiTexCoord2 (0, 0.0f, 0.0f);
 
- 		GL.Vertex3 (0.0f, 0.0f, 3.0f); // BL
 
- 		GL.MultiTexCoord2 (0, 1.0f, 0.0f);
 
- 		GL.Vertex3 (1.0f, 0.0f, 2.0f); // BR
 
- 		GL.MultiTexCoord2 (0, 1.0f, 1.0f);
 
- 		GL.Vertex3 (1.0f, 1.0f, 1.0f); // TR
 
- 		GL.MultiTexCoord2 (0, 0.0f, 1.0f);
 
- 		GL.Vertex3 (0.0f, 1.0f, 0.0f); // TL
 
- 		GL.End ();
 
- 		GL.PopMatrix ();
 
- 	}
 
- }
 
 
  |