You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.2 KiB
97 lines
3.2 KiB
using UnityEngine; |
|
using System.Collections; |
|
|
|
[ExecuteInEditMode] |
|
[RequireComponent (typeof(Camera))] |
|
[AddComponentMenu("azure[Sky]/Fog Scattering")] |
|
public class AzureFog : MonoBehaviour |
|
{ |
|
public Material fogMaterial; |
|
|
|
|
|
//======================================================================================================= |
|
//------------------------------------------------------------------------------------------------------- |
|
// [ImageEffectOpaque] |
|
void OnRenderImage(RenderTexture source, RenderTexture destination) |
|
{ |
|
//------------------------------------------------------------------------------------------------------- |
|
GetComponent<Camera>().depthTextureMode |= DepthTextureMode.Depth; |
|
if (fogMaterial==null) |
|
{ |
|
Graphics.Blit (source, destination); |
|
#if UNITY_EDITOR |
|
Debug.Log("Warning. Apply the <b>Fog Material</b> to ('Fog Scattering Image Effect') script in the Main Camera Inspector"); |
|
#endif |
|
return; |
|
} |
|
//------------------------------------------------------------------------------------------------------- |
|
Camera cam = GetComponent<Camera>(); |
|
float CAMERA_NEAR = cam.nearClipPlane; |
|
float CAMERA_FAR = cam.farClipPlane; |
|
float CAMERA_FOV = cam.fieldOfView; |
|
float CAMERA_ASPECT_RATIO = cam.aspect; |
|
|
|
Matrix4x4 frustumCorners = Matrix4x4.identity; |
|
|
|
float fovWHalf = CAMERA_FOV * 0.5f; |
|
|
|
Vector3 toRight = GetComponent<Camera>().transform.right * CAMERA_NEAR * Mathf.Tan (fovWHalf * Mathf.Deg2Rad) * CAMERA_ASPECT_RATIO; |
|
Vector3 toTop = GetComponent<Camera>().transform.up * CAMERA_NEAR * Mathf.Tan (fovWHalf * Mathf.Deg2Rad); |
|
|
|
Vector3 topLeft = (GetComponent<Camera>().transform.forward * CAMERA_NEAR - toRight + toTop); |
|
float CAMERA_SCALE = topLeft.magnitude * CAMERA_FAR/CAMERA_NEAR; |
|
|
|
topLeft.Normalize(); |
|
topLeft *= CAMERA_SCALE; |
|
|
|
Vector3 topRight = (cam.transform.forward * CAMERA_NEAR + toRight + toTop); |
|
topRight.Normalize(); |
|
topRight *= CAMERA_SCALE; |
|
|
|
Vector3 bottomRight = (cam.transform.forward * CAMERA_NEAR + toRight - toTop); |
|
bottomRight.Normalize(); |
|
bottomRight *= CAMERA_SCALE; |
|
|
|
Vector3 bottomLeft = (cam.transform.forward * CAMERA_NEAR - toRight - toTop); |
|
bottomLeft.Normalize(); |
|
bottomLeft *= CAMERA_SCALE; |
|
|
|
frustumCorners.SetRow (0, topLeft); |
|
frustumCorners.SetRow (1, topRight); |
|
frustumCorners.SetRow (2, bottomRight); |
|
frustumCorners.SetRow (3, bottomLeft); |
|
|
|
fogMaterial.SetMatrix ("_FrustumCorners", frustumCorners); |
|
|
|
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 (); |
|
} |
|
} |