Skip to content

Commit b9a2759

Browse files
svc-reach-platform-supportEvergreen
authored andcommitted
[Port] [Forward] Clear indirect arguments buffer for local fog volumes.
1 parent 74cbb80 commit b9a2759

File tree

5 files changed

+55
-2
lines changed

5 files changed

+55
-2
lines changed

Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/VolumetricLighting/HDRenderPipeline.VolumetricLighting.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1051,11 +1051,13 @@ class VolumetricFogVoxelizationPassData
10511051
public bool fogOverdrawDebugEnabled;
10521052

10531053
// Regular fogs
1054+
public ComputeShader clearVolumetricMaterialCS;
10541055
public ComputeShader volumetricMaterialCS;
10551056
public GraphicsBuffer globalIndirectBuffer;
10561057
public GraphicsBuffer globalIndirectionBuffer;
10571058
public GraphicsBuffer materialDataBuffer;
10581059
public GraphicsBuffer visibleVolumeGlobalIndices;
1060+
public int clearRenderingParametersKernel;
10591061
public int computeRenderingParametersKernel;
10601062
public ComputeBuffer visibleVolumeBoundsBuffer;
10611063
}
@@ -1210,7 +1212,9 @@ unsafe TextureHandle FogVolumeAndVFXVoxelizationPass(RenderGraph renderGraph,
12101212
passData.vfxDebugRendererList = renderGraph.CreateRendererList(vfxDebugFogRenderListDesc);
12111213
builder.UseRendererList(passData.vfxDebugRendererList);
12121214
}
1215+
passData.clearVolumetricMaterialCS = runtimeShaders.clearVolumetricMaterialCS;
12131216
passData.volumetricMaterialCS = runtimeShaders.volumetricMaterialCS;
1217+
passData.clearRenderingParametersKernel = passData.clearVolumetricMaterialCS.FindKernel("Clear");
12141218
passData.computeRenderingParametersKernel = passData.volumetricMaterialCS.FindKernel("ComputeVolumetricMaterialRenderingParameters");
12151219
passData.visibleVolumeBoundsBuffer = visibleVolumeBoundsBuffer;
12161220
passData.globalIndirectBuffer = LocalVolumetricFogManager.manager.globalIndirectBuffer;
@@ -1226,6 +1230,13 @@ unsafe TextureHandle FogVolumeAndVFXVoxelizationPass(RenderGraph renderGraph,
12261230
{
12271231
var natCmd = CommandBufferHelpers.GetNativeCommandBuffer(ctx.cmd);
12281232

1233+
// Clear the indirect arguments.
1234+
natCmd.SetComputeBufferParam(data.clearVolumetricMaterialCS, data.clearRenderingParametersKernel, HDShaderIDs._VolumetricGlobalIndirectArgsBuffer, data.globalIndirectBuffer);
1235+
natCmd.SetComputeIntParam(data.clearVolumetricMaterialCS, HDShaderIDs._MaxVolumeCount, data.globalIndirectBuffer.count);
1236+
1237+
int dispatchXCount = HDUtils.DivRoundUp(data.globalIndirectBuffer.count, 64);
1238+
natCmd.DispatchCompute(data.clearVolumetricMaterialCS, data.clearRenderingParametersKernel, dispatchXCount, 1, 1);
1239+
12291240
// Prepare draw indirect command for the draw
12301241
int volumeCount = data.volumetricFogs.Count;
12311242

@@ -1240,7 +1251,7 @@ unsafe TextureHandle FogVolumeAndVFXVoxelizationPass(RenderGraph renderGraph,
12401251
natCmd.SetComputeIntParam(data.volumetricMaterialCS, HDShaderIDs._VolumetricViewCount, data.hdCamera.viewCount);
12411252
ConstantBuffer.PushGlobal(natCmd, data.volumetricCB, HDShaderIDs._ShaderVariablesVolumetric);
12421253

1243-
int dispatchXCount = Mathf.Max(1, Mathf.CeilToInt((float)(volumeCount * data.hdCamera.viewCount) / 32.0f));
1254+
dispatchXCount = Mathf.Max(1, Mathf.CeilToInt((float)(volumeCount * data.hdCamera.viewCount) / 32.0f));
12441255
natCmd.DispatchCompute(data.volumetricMaterialCS, data.computeRenderingParametersKernel, dispatchXCount, 1, 1);
12451256

12461257
natCmd.SetGlobalBuffer(HDShaderIDs._VolumetricGlobalIndirectionBuffer, data.globalIndirectionBuffer);
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch switch2
2+
3+
#pragma kernel Clear
4+
5+
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
6+
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl"
7+
8+
uint _MaxVolumeCount;
9+
10+
RWBuffer<uint> _VolumetricGlobalIndirectArgsBuffer;
11+
12+
[numthreads(64, 1, 1)]
13+
void Clear(uint3 dispatchThreadID : SV_DispatchThreadID)
14+
{
15+
if (dispatchThreadID.x >= _MaxVolumeCount)
16+
return;
17+
18+
uint volumeIndex = dispatchThreadID.x;
19+
20+
_VolumetricGlobalIndirectArgsBuffer[volumeIndex * 5 + 0] = 0; // IndexCountPerInstance
21+
_VolumetricGlobalIndirectArgsBuffer[volumeIndex * 5 + 1] = 0; // InstanceCount
22+
_VolumetricGlobalIndirectArgsBuffer[volumeIndex * 5 + 2] = 0; // StartIndexLocation
23+
_VolumetricGlobalIndirectArgsBuffer[volumeIndex * 5 + 3] = 0; // BaseVertexLocation
24+
_VolumetricGlobalIndirectArgsBuffer[volumeIndex * 5 + 4] = 0; // StartInstanceLocation
25+
}

Packages/com.unity.render-pipelines.high-definition/Runtime/Material/VolumetricMaterial/ClearVolumetricMaterial.compute.meta

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,6 +1206,7 @@ static class HDShaderIDs
12061206

12071207
// Volumetric Materials
12081208
public static readonly int _VolumeCount = Shader.PropertyToID("_VolumeCount");
1209+
public static readonly int _MaxVolumeCount = Shader.PropertyToID("_MaxVolumeCount");
12091210
public static readonly int _MaxSliceCount = Shader.PropertyToID("_MaxSliceCount");
12101211
public static readonly int _VolumetricGlobalIndirectArgsBuffer = Shader.PropertyToID("_VolumetricGlobalIndirectArgsBuffer");
12111212
public static readonly int _VolumetricGlobalIndirectionBuffer = Shader.PropertyToID("_VolumetricGlobalIndirectionBuffer");

Packages/com.unity.render-pipelines.high-definition/Runtime/Settings/HDRenderPipelineRuntimeShaders.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public Shader copyDepthBufferPS
120120
get => m_CopyDepthBufferPS;
121121
set => this.SetValueAndNotify(ref m_CopyDepthBufferPS, value);
122122
}
123-
123+
124124
[SerializeField, ResourcePath("Runtime/ShaderLibrary/Blit.shader")]
125125
private Shader m_BlitPS;
126126

@@ -822,6 +822,15 @@ public ComputeShader volumetricMaterialCS
822822
set => this.SetValueAndNotify(ref m_VolumetricMaterialCS, value);
823823
}
824824

825+
[SerializeField, ResourcePath("Runtime/Material/VolumetricMaterial/ClearVolumetricMaterial.compute")]
826+
private ComputeShader m_ClearVolumetricMaterialCS;
827+
828+
public ComputeShader clearVolumetricMaterialCS
829+
{
830+
get => m_ClearVolumetricMaterialCS;
831+
set => this.SetValueAndNotify(ref m_ClearVolumetricMaterialCS, value);
832+
}
833+
825834
[SerializeField, ResourcePath("Runtime/Material/Eye/EyeCausticLUTGen.compute")]
826835
private ComputeShader m_EyeMaterialCS;
827836

0 commit comments

Comments
 (0)