Files
Fishing2/Assets/Plugins/Azure[Sky] Dynamic Skybox/Core/Scripts/AzureFogScatteringRenderer.cs
2026-01-25 11:25:49 +08:00

100 lines
5.0 KiB
C#

//Based on Unity's GlobalFog.
namespace UnityEngine.AzureSky
{
[ExecuteInEditMode]
[ImageEffectAllowedInSceneView]
[RequireComponent(typeof(Camera))]
[AddComponentMenu("Azure[Sky] Dynamic Skybox/Azure Fog Scattering Renderer")]
public sealed class AzureFogScatteringRenderer : MonoBehaviour
{
#pragma warning disable 0108 // Remove warning caused by obsolete members that do not actually exist
/// <summary>The reference to the camera that the fog scattering should be rendered.</summary>
public Camera camera { get => m_camera; set => m_camera = value; }
private Camera m_camera = null;
#pragma warning restore 0108
/// <summary>The material that will render the fog scattering RenderTexture into the screen.</summary>
public Material fogRendererMaterial { get => m_fogRendererMaterial; set => m_fogRendererMaterial = value; }
[SerializeField] private Material m_fogRendererMaterial = null;
/// <summary>The material that will compute the fog scattering effect and render it into a RenderTexture.</summary>
public Material fogComputationMaterial { get => m_fogComputationMaterial; set => m_fogComputationMaterial = value; }
[SerializeField] private Material m_fogComputationMaterial = null;
/// <summary>The render texture that stores the fog scattering data. (RGB: Scattering Data), (Alpha: Fog Data).</summary>
public RenderTexture fogScatteringRT { get => m_fogScatteringRT; set => m_fogScatteringRT = value; }
[SerializeField] private RenderTexture m_fogScatteringRT = null;
/// <summary>The start width resolution of the fog scattering render texture.</summary>
public int fogRenderTextureWidth => m_fogRenderTextureWidth;
[SerializeField] private int m_fogRenderTextureWidth = 1920;
/// <summary>The start height resolution of the fog scattering render texture.</summary>
public int fogRenderTextureHeight => m_fogRenderTextureHeight;
[SerializeField] private int m_fogRenderTextureHeight = 1080;
/// <summary>Stores the camera frunstum corners position.</summary>
private Vector3[] m_frustumCorners = new Vector3[4];
/// <summary>The view port rect.</summary>
private Rect m_viewRect = new Rect(0, 0, 1, 1);
/// <summary>The camera frustum corners matrix.</summary>
private Matrix4x4 m_frustumCornersArray = Matrix4x4.identity;
private void Start()
{
m_camera = GetComponent<Camera>();
SetFogScatteringResolution(m_fogRenderTextureWidth, m_fogRenderTextureHeight);
}
private void OnEnable()
{
m_camera = GetComponent<Camera>();
}
[ImageEffectOpaque]
void OnRenderImage(RenderTexture source, RenderTexture destination)
{
m_camera.depthTextureMode |= DepthTextureMode.Depth;
if (m_fogComputationMaterial == null || m_fogRendererMaterial == null)
{
Graphics.Blit(source, destination);
return;
}
m_camera.CalculateFrustumCorners(m_viewRect, m_camera.farClipPlane, m_camera.stereoActiveEye, m_frustumCorners);
m_frustumCornersArray = Matrix4x4.identity;
m_frustumCornersArray.SetRow(0, m_camera.transform.TransformVector(m_frustumCorners[0])); // bottom left
m_frustumCornersArray.SetRow(2, m_camera.transform.TransformVector(m_frustumCorners[1])); // top left
m_frustumCornersArray.SetRow(3, m_camera.transform.TransformVector(m_frustumCorners[2])); // top right
m_frustumCornersArray.SetRow(1, m_camera.transform.TransformVector(m_frustumCorners[3])); // bottom right
m_fogComputationMaterial.SetMatrix(AzureShaderUniforms.FrustumCornersMatrix, m_frustumCornersArray);
m_fogRendererMaterial.SetMatrix(AzureShaderUniforms.FrustumCornersMatrix, m_frustumCornersArray);
// Compute the fog scattering effect and render it into a RenderTexture
Graphics.Blit(null, m_fogScatteringRT, m_fogComputationMaterial, 0);
// Render the fog scattering RenderTexture into the screen.
m_fogRendererMaterial.SetTexture(AzureShaderUniforms.FogScatteringDataTexture, m_fogScatteringRT);
Graphics.Blit(source, destination, m_fogRendererMaterial, 0);
}
/// <summary>Sets the resolution of the render texture that stores fog scattering data.</summary>
public void SetFogScatteringResolution(int width, int height)
{
m_fogRenderTextureWidth = width;
m_fogRenderTextureHeight = height;
m_fogScatteringRT = new RenderTexture(width, height, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default)
{
name = "Fog Scattering RT",
wrapMode = TextureWrapMode.Clamp,
filterMode = FilterMode.Bilinear
};
m_fogScatteringRT.Create();
}
}
}