You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
5.1 KiB
96 lines
5.1 KiB
using System.Collections.Generic;
|
|
using Unity.Mathematics;
|
|
using UnityEngine.Experimental.Rendering;
|
|
using UnityEngine.Rendering.RenderGraphModule;
|
|
|
|
namespace UnityEngine.Rendering.HighDefinition
|
|
{
|
|
partial class WaterSystem
|
|
{
|
|
ShaderVariablesWaterDebug[] m_WaterDebugCBs = new ShaderVariablesWaterDebug[k_MaxNumWaterSurfaceProfiles];
|
|
|
|
class WaterRenderingMaskData : WaterRenderingData
|
|
{
|
|
public ShaderVariablesWaterDebug[] waterDebugCBs;
|
|
}
|
|
|
|
internal void RenderWaterDebug(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle colorBuffer, TextureHandle depthBuffer, WaterGBuffer waterGBuffer)
|
|
{
|
|
if (waterGBuffer.debugRequired)
|
|
RenderWaterDebug(renderGraph, hdCamera, colorBuffer, depthBuffer);
|
|
}
|
|
|
|
internal void RenderWaterDebug(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle colorBuffer, TextureHandle depthBuffer)
|
|
{
|
|
if (!ShouldRenderWater(hdCamera))
|
|
return;
|
|
|
|
using (var builder = renderGraph.AddUnsafePass<WaterRenderingMaskData>("Render Water Surface Mask Debug", out var passData, ProfilingSampler.Get(HDProfileId.WaterMaskDebug)))
|
|
{
|
|
WaterRendering settings = hdCamera.volumeStack.GetComponent<WaterRendering>();
|
|
PrepareWaterRenderingData(passData, hdCamera);
|
|
|
|
passData.waterDebugCBs = m_WaterDebugCBs;
|
|
|
|
var waterSurfaces = WaterSurface.instancesAsArray;
|
|
for (int surfaceIdx = 0; surfaceIdx < passData.numSurfaces; ++surfaceIdx)
|
|
{
|
|
// Grab the current water surface
|
|
WaterSurface currentWater = waterSurfaces[surfaceIdx];
|
|
ref var surfaceData = ref passData.surfaces[surfaceIdx];
|
|
|
|
surfaceData.renderDebug = m_RenderPipeline.NeedDebugDisplay() || currentWater.debugMode != WaterDebugMode.None;
|
|
if (!surfaceData.renderDebug) continue;
|
|
|
|
// Prepare all the internal parameters
|
|
PrepareSurfaceGBufferData(hdCamera, settings, currentWater, surfaceIdx, ref surfaceData);
|
|
|
|
// Debug Data
|
|
ref var debugCB = ref passData.waterDebugCBs[surfaceIdx];
|
|
debugCB._WaterDebugMode = (int)currentWater.debugMode;
|
|
debugCB._WaterMaskDebugMode = (int)currentWater.waterMaskDebugMode;
|
|
debugCB._WaterCurrentDebugMode = (int)currentWater.waterCurrentDebugMode;
|
|
debugCB._CurrentDebugMultiplier = currentWater.currentDebugMultiplier;
|
|
debugCB._WaterFoamDebugMode = (int)currentWater.waterFoamDebugMode;
|
|
|
|
if (currentWater.waterCurrentDebugMode == WaterCurrentDebugMode.Ripples && currentWater.ripplesMotionMode == WaterPropertyOverrideMode.Inherit)
|
|
debugCB._WaterCurrentDebugMode = (int)WaterCurrentDebugMode.Large;
|
|
if (currentWater.surfaceType == WaterSurfaceType.Pool)
|
|
debugCB._WaterCurrentDebugMode = (int)WaterCurrentDebugMode.Ripples;
|
|
}
|
|
|
|
// Output buffers
|
|
builder.SetRenderAttachment(colorBuffer, 0);
|
|
builder.SetRenderAttachmentDepth(depthBuffer, AccessFlags.ReadWrite);
|
|
|
|
// Request the output textures
|
|
builder.SetRenderFunc(
|
|
(WaterRenderingMaskData data, UnsafeGraphContext ctx) =>
|
|
{
|
|
var natCmd = CommandBufferHelpers.GetNativeCommandBuffer(ctx.cmd);
|
|
natCmd.SetGlobalTexture(HDShaderIDs._WaterSectorData, data.sectorDataBuffer);
|
|
natCmd.SetGlobalBuffer(HDShaderIDs._WaterPatchData, data.patchDataBuffer);
|
|
natCmd.SetGlobalBuffer(HDShaderIDs._FrustumGPUBuffer, data.frustumBuffer);
|
|
|
|
// Normally we should bind this into the material property block, but on metal there seems to be an issue. This fixes it.
|
|
natCmd.SetGlobalFloat(HDShaderIDs._CullWaterMask, (int)CullMode.Off);
|
|
|
|
for (int surfaceIdx = 0; surfaceIdx < data.numSurfaces; ++surfaceIdx)
|
|
{
|
|
ref var surfaceData = ref data.surfaces[surfaceIdx];
|
|
|
|
if (surfaceData.renderDebug)
|
|
{
|
|
natCmd.SetBufferData(data.perCameraCB, data.sharedPerCameraDataArray, surfaceData.surfaceIndex, 0, 1);
|
|
ConstantBuffer.Push(natCmd, data.waterDebugCBs[surfaceIdx], surfaceData.waterMaterial, HDShaderIDs._ShaderVariablesWaterDebug);
|
|
SetupWaterShaderKeyword(natCmd, data.decalWorkflow, surfaceData.numActiveBands, surfaceData.activeCurrent);
|
|
DrawWaterSurface(natCmd, k_PassesWaterDebug, data, ref surfaceData);
|
|
ResetWaterShaderKeyword(natCmd);
|
|
}
|
|
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|