升级水插件

This commit is contained in:
2026-01-08 22:30:55 +08:00
parent febff82d24
commit ca68084264
415 changed files with 18138 additions and 7134 deletions

View File

@@ -1,4 +1,4 @@
// Crest Water System
// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
using UnityEngine;
@@ -20,55 +20,39 @@ namespace WaveHarmonic.Crest
/// <summary>
/// The source of collisions (ie water shape).
/// </summary>
[@GenerateDoc]
public enum CollisionSource
{
/// <summary>
/// No collision source. Flat water.
/// </summary>
/// <inheritdoc cref="Generated.CollisionSource.None"/>
[Tooltip("No collision source. Flat water.")]
None = 0,
// GerstnerWavesCPU = 1,
/// <summary>
/// Uses AsyncGPUReadback to retrieve data from GPU to CPU.
/// </summary>
/// <remarks>
/// This is the most optimal approach.
/// </remarks>
/// <inheritdoc cref="Generated.CollisionSource.GPU"/>
[Tooltip("Uses AsyncGPUReadback to retrieve data from GPU to CPU.\n\nThis is the most optimal approach.")]
GPU = 2,
/// <summary>
/// Computes data entirely on the CPU.
/// </summary>
/// <inheritdoc cref="Generated.CollisionSource.CPU"/>
[Tooltip("Computes data entirely on the CPU.")]
CPU = 3,
}
/// <summary>
/// The pass to render displacement into.
/// </summary>
[@GenerateDoc]
public enum DisplacementPass
{
/// <summary>
/// Displacement that is dependent on an LOD (eg waves).
/// </summary>
/// <remarks>
/// Uses filtering to determine which LOD to write to.
/// </remarks>
/// <inheritdoc cref="Generated.DisplacementPass.LodDependent"/>
[Tooltip("Displacement that is dependent on an LOD (eg waves).\n\nUses filtering to determine which LOD to write to.")]
LodDependent,
/// <summary>
/// Renders to all LODs.
/// </summary>
/// <inheritdoc cref="Generated.DisplacementPass.LodIndependent"/>
[Tooltip("Renders to all LODs.")]
LodIndependent,
/// <summary>
/// Renders to all LODs, but as a separate pass.
/// </summary>
/// <remarks>
/// Typically used to render visual displacement which does not affect collisions.
/// </remarks>
/// <inheritdoc cref="Generated.DisplacementPass.LodIndependentLast"/>
[Tooltip("Renders to all LODs, but as a separate pass.\n\nTypically used to render visual displacement which does not affect collisions.")]
[InspectorName("Lod Independent (Last)")]
LodIndependentLast,
@@ -78,35 +62,24 @@ namespace WaveHarmonic.Crest
/// Flags to enable extra collsion layers.
/// </summary>
[System.Flags]
[@GenerateDoc]
public enum CollisionLayers
{
// NOTE: numbers must be in order for defaults to work (everything first).
/// <summary>
/// All layers.
/// </summary>
/// <inheritdoc cref="Generated.CollisionLayers.Everything"/>
[Tooltip("All layers.")]
Everything = -1,
/// <summary>
/// No extra layers (ie single layer).
/// </summary>
/// <inheritdoc cref="Generated.CollisionLayers.Nothing"/>
[Tooltip("No extra layers (ie single layer).")]
Nothing,
/// <summary>
/// Separate layer for dynamic waves.
/// </summary>
/// <remarks>
/// Dynamic waves are normally combined together for efficiency. By enabling this
/// layer, dynamic waves are combined and added in a separate pass.
/// </remarks>
/// <inheritdoc cref="Generated.CollisionLayers.DynamicWaves"/>
[Tooltip("Separate layer for dynamic waves.\n\nDynamic waves are normally combined together for efficiency. By enabling this layer, dynamic waves are combined and added in a separate pass.")]
DynamicWaves = 1 << 1,
/// <summary>
/// Extra displacement layer for visual displacement.
/// </summary>
/// <inheritdoc cref="Generated.CollisionLayers.Displacement"/>
[Tooltip("Extra displacement layer for visual displacement.")]
Displacement = 1 << 2,
}
@@ -180,6 +153,9 @@ namespace WaveHarmonic.Crest
internal BakedWaveData _BakedWaveData;
const string k_DrawCombine = "Combine";
internal static new partial class ShaderIDs
{
public static readonly int s_WaveBuffer = Shader.PropertyToID("_Crest_WaveBuffer");
@@ -201,7 +177,6 @@ namespace WaveHarmonic.Crest
private protected override bool NeedToReadWriteTextureData => true;
private protected override Color ClearColor => Color.black;
internal override int BufferCount => _Water.WriteMotionVectors ? 2 : 1;
internal override bool RunsInHeadless => true;
// NOTE: Tried RGB111110Float but errors becomes visible. One option would be to use a UNORM setup.
private protected override GraphicsFormat RequestedTextureFormat => _TextureFormatMode switch
@@ -259,7 +234,7 @@ namespace WaveHarmonic.Crest
internal override void BuildCommandBuffer(WaterRenderer water, CommandBuffer buffer)
{
buffer.BeginSample(Name);
buffer.BeginSample(ID);
FlipBuffers();
@@ -267,8 +242,7 @@ namespace WaveHarmonic.Crest
// Get temporary buffer to store waves. They will be copied in the combine pass.
buffer.GetTemporaryRT(ShaderIDs.s_WaveBuffer, DataTexture.descriptor);
buffer.SetRenderTarget(ShaderIDs.s_WaveBuffer, 0, CubemapFace.Unknown, -1);
buffer.ClearRenderTarget(false, true, ClearColor);
CoreUtils.SetRenderTarget(buffer, ShaderIDs.s_WaveBuffer, ClearFlag.Color, ClearColor);
// LOD dependent data.
// Write to per-octave _WaveBuffers. Not the same as _AnimatedWaves.
@@ -304,7 +278,7 @@ namespace WaveHarmonic.Crest
}
}
buffer.BeginSample("Combine");
buffer.BeginSample(k_DrawCombine);
// Combine waves.
for (var slice = lastSlice; slice >= 0; slice--)
@@ -327,7 +301,7 @@ namespace WaveHarmonic.Crest
wrapper.Dispatch(threadSize, threadSize, 1);
}
buffer.EndSample("Combine");
buffer.EndSample(k_DrawCombine);
}
buffer.ReleaseTemporaryRT(ShaderIDs.s_WaveBuffer);
@@ -372,16 +346,22 @@ namespace WaveHarmonic.Crest
// Query collisions including only Animated Waves.
// Requires copying the water level.
Provider.UpdateQueries(_Water, CollisionLayer.AfterAnimatedWaves);
// Guard not required, as Query already does this check before returning the
// correct provider, thus nothing would be reqistered nor dispatched. But seems
// right to do so anyhow.
if (_CollisionLayers != CollisionLayers.Nothing)
{
Provider.UpdateQueries(_Water, CollisionLayer.AfterAnimatedWaves);
}
// Transfer Dynamic Waves to Animated Waves.
if (_CollisionLayers.HasFlag(CollisionLayers.DynamicWaves) && _Water._DynamicWavesLod.Enabled)
{
buffer.BeginSample("Combine");
buffer.BeginSample(k_DrawCombine);
// Clearing not required as we overwrite enter texture.
buffer.GetTemporaryRT(ShaderIDs.s_DynamicWavesTarget, DataTexture.descriptor);
var wrapper = new PropertyWrapperCompute(buffer, _CombineShader, 8);
var wrapper = new PropertyWrapperCompute(buffer, _CombineShader, 9);
wrapper.SetTexture(ShaderIDs.s_DynamicWavesTarget, ShaderIDs.s_DynamicWavesTarget);
@@ -392,22 +372,28 @@ namespace WaveHarmonic.Crest
{
wrapper.SetInteger(Lod.ShaderIDs.s_LodIndex, slice);
wrapper.Dispatch(threadSize, threadSize, 1);
// Change to kernel with combine enabled.
if (slice == lastSlice)
{
wrapper = new(buffer, _CombineShader, 8);
}
}
// Copy Dynamic Waves displacement into Animated Waves.
{
wrapper = new PropertyWrapperCompute(buffer, _CombineShader, 9);
wrapper = new(buffer, _CombineShader, 10);
wrapper.SetTexture(ShaderIDs.s_AnimatedWavesTarget, DataTexture);
wrapper.SetTexture(ShaderIDs.s_DynamicWavesTarget, ShaderIDs.s_DynamicWavesTarget);
wrapper.Dispatch(threadSize, threadSize, Slices);
}
buffer.ReleaseTemporaryRT(ShaderIDs.s_DynamicWavesTarget);
buffer.EndSample("Combine");
buffer.EndSample(k_DrawCombine);
// Query collisions including Dynamic Waves.
// Does not require copying the water level as they are added with zero alpha.
_Water.CollisionProvider.UpdateQueries(_Water, CollisionLayer.AfterDynamicWaves);
Provider.UpdateQueries(_Water, CollisionLayer.AfterDynamicWaves);
}
if (_CollisionLayers.HasFlag(CollisionLayers.Displacement))
@@ -429,7 +415,12 @@ namespace WaveHarmonic.Crest
Shader.SetGlobalTexture(_TextureShaderID, DataTexture);
}
buffer.EndSample(Name);
buffer.EndSample(ID);
}
internal override void AfterExecute()
{
Provider.SendReadBack(_Water, _CollisionLayers);
}
/// <summary>