升级水插件
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user