NewN_UAVPlane/Assets/art/shandi/EFFECTS/Features/AtmosphericScattering/Code/AtmosphericScatteringDeferr...

107 lines
2.9 KiB
C#

using UnityEngine;
[ExecuteInEditMode]
[ImageEffectAllowedInSceneView]
public class AtmosphericScatteringDeferred : UnityStandardAssets.ImageEffects.PostEffectsBase {
[HideInInspector] public Shader deferredFogShader = null;
Material m_fogMaterial;
public override bool CheckResources() {
CheckSupport (true);
if(!deferredFogShader)
deferredFogShader = Shader.Find("Hidden/AtmosphericScattering_Deferred");
m_fogMaterial = CheckShaderAndCreateMaterial(deferredFogShader, m_fogMaterial);
if(!isSupported)
ReportAutoDisable();
return isSupported;
}
[ImageEffectOpaque]
void OnRenderImage(RenderTexture source, RenderTexture destination) {
Camera cam = GetComponent<Camera>();
var shouldRender = CheckResources() &&
((cam && cam.actualRenderingPath == RenderingPath.DeferredShading) || (AtmosphericScattering.instance && AtmosphericScattering.instance.forcePostEffect));
if(!shouldRender) {
Graphics.Blit(source, destination);
return;
}
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;
m_fogMaterial.SetMatrix("_FrustumCornersWS", frustumCorners);
m_fogMaterial.SetVector("_CameraWS", camPos);
CustomGraphicsBlit(source, destination, m_fogMaterial, 0);
}
static void CustomGraphicsBlit(RenderTexture src, RenderTexture dst, Material mat, int pass) {
RenderTexture.active = dst;
mat.SetTexture("_MainTex", src);
GL.PushMatrix();
GL.LoadOrtho();
mat.SetPass(pass);
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();
}
}