OldBlueWater/BlueWater/Assets/StylizedWater2/Runtime/DynamicEffects/DisplacementToNormalsPass.cs
2023-12-15 15:15:44 +09:00

79 lines
2.9 KiB
C#

//Stylized Water 2
//Staggart Creations (http://staggart.xyz)
//Copyright protected under Unity Asset Store EULA
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
namespace StylizedWater2.DynamicEffects
{
internal class DisplacementToNormalsPass : ScriptableRenderPass
{
private const string profilerTag = "Water Dynamic Effects: Normals";
private static readonly ProfilingSampler profilerSampler = new ProfilingSampler(profilerTag);
private RTHandle renderTarget;
private Material Material;
private int resolution;
private int m_resolution;
private bool mipmaps;
private bool m_mipmaps;
private static readonly string WaterDynamicEffectsNormalsName = "_WaterDynamicEffectsNormals";
private static readonly int _WaterDynamicEffectsNormalsID = Shader.PropertyToID(WaterDynamicEffectsNormalsName);
private static readonly int _TexelSizeID = Shader.PropertyToID("_TexelSize");
public void Setup(int targetResolution, bool mipmapsEnabled, Shader shader)
{
this.resolution = targetResolution;
this.mipmaps = mipmapsEnabled;
if (!Material && shader) Material = CoreUtils.CreateEngineMaterial(shader);
}
public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
{
if (resolution != m_resolution || mipmaps != m_mipmaps || renderTarget == null)
{
RTHandles.Release(renderTarget);
renderTarget = RTHandles.Alloc(resolution, resolution, 1, DepthBits.None,
UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8_UNorm,
filterMode: FilterMode.Bilinear,
wrapMode: TextureWrapMode.Clamp,
useMipMap: mipmaps,
autoGenerateMips: true,
name: WaterDynamicEffectsNormalsName);
}
m_resolution = resolution;
m_mipmaps = mipmaps;
cmd.SetGlobalTexture(_WaterDynamicEffectsNormalsID, renderTarget);
ConfigureTarget(renderTarget);
ConfigureClear(ClearFlag.Color, Color.clear);
}
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
CommandBuffer cmd = CommandBufferPool.Get();
using (new ProfilingScope(cmd, profilerSampler))
{
cmd.SetGlobalFloat(_TexelSizeID, 1f / resolution);
cmd.Blit(null, renderTarget, Material);
}
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}
public void Dispose()
{
RTHandles.Release(renderTarget);
UnityEngine.Object.DestroyImmediate(Material);
}
}
}