Skip to content

Commit 6e36834

Browse files
ludovic-theobaldEvergreen
authored andcommitted
[VFX][Tests] Added test visualizing the baked SDF
This PR adds a test for the SDF Baker to explicitly visualize the result of the baking, instead of relying only on collisions with SDF like in the test scene 36_SkinnedSDF. Adding the test highlighted a failure on Apple Silicon, due to restrictions on read-write textures. The PR modifies the baker to avoid problematic read-write operations by adding another copy of the "ray map" and using a ping-pong approach.
1 parent 4954ec9 commit 6e36834

File tree

16 files changed

+5727
-115
lines changed

16 files changed

+5727
-115
lines changed

Packages/com.unity.visualeffectgraph/Runtime/Utilities/SDF/MeshToSDFBaker.cs

Lines changed: 56 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace UnityEngine.VFX.SDF
1313
/// </summary>
1414
public class MeshToSDFBaker : IDisposable
1515
{
16-
private RenderTexture m_RayMap, m_SignMap, m_SignMapBis;
16+
private RenderTexture[] m_RayMaps, m_SignMaps;
1717
private RenderTexture[] m_RenderTextureViews;
1818
private GraphicsBuffer m_CounterBuffer, m_AccumCounterBuffer, m_TrianglesInVoxels, m_TrianglesUV;
1919
private GraphicsBuffer
@@ -55,6 +55,8 @@ private GraphicsBuffer
5555
private float[] m_MinBoundsExtended = new float[3];
5656
private float[] m_MaxBoundsExtended = new float[3];
5757

58+
private int m_RayMapUseCounter = 0;
59+
5860
internal static uint kMaxRecommandedGridSize = 1 << 24;
5961
internal static uint kMaxAbsoluteGridSize = 1 << 27;
6062

@@ -347,15 +349,16 @@ void InitTextures()
347349

348350
CreateRenderTextureIfNeeded(ref m_textureVoxel, rtDesc4Channels);
349351
CreateRenderTextureIfNeeded(ref m_textureVoxelBis, rtDesc4Channels);
350-
CreateRenderTextureIfNeeded(ref m_RayMap, rtDesc4Channels);
351-
CreateRenderTextureIfNeeded(ref m_SignMap, rtDescSignMap);
352-
CreateRenderTextureIfNeeded(ref m_SignMapBis, rtDescSignMap);
352+
m_RayMaps = new RenderTexture[2];
353+
m_SignMaps = new RenderTexture[2];
354+
for (int i = 0; i < 2; i++)
355+
{
356+
CreateRenderTextureIfNeeded(ref m_RayMaps[i], rtDesc4Channels);
357+
CreateRenderTextureIfNeeded(ref m_SignMaps[i], rtDescSignMap);
358+
}
353359

354360
CreateRenderTextureIfNeeded(ref m_DistanceTexture, rtDesc1Channel);
355-
356-
CreateGraphicsBufferIfNeeded(ref m_bufferVoxel, GetTotalVoxelCount(),
357-
4 * sizeof(float));
358-
361+
CreateGraphicsBufferIfNeeded(ref m_bufferVoxel, GetTotalVoxelCount(), 4 * sizeof(float));
359362
InitPrefixSumBuffers();
360363
}
361364

@@ -618,11 +621,11 @@ void JFA()
618621

619622
void GenerateRayMap()
620623
{
624+
m_RayMapUseCounter = 0;
621625
m_Cmd.BeginSample("BakeSDF.Raymap");
622626
m_Cmd.SetComputeBufferParam(m_computeShader, m_Kernels.generateRayMapLocal, ShaderProperties.accumCounter, m_AccumCounterBuffer);
623627
m_Cmd.SetComputeBufferParam(m_computeShader, m_Kernels.generateRayMapLocal, ShaderProperties.triangleIDs, m_TrianglesInVoxels);
624628
m_Cmd.SetComputeBufferParam(m_computeShader, m_Kernels.generateRayMapLocal, ShaderProperties.trianglesUV, m_TrianglesUV);
625-
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.generateRayMapLocal, ShaderProperties.rayMap, m_RayMap);
626629

627630
m_Cmd.BeginSample("BakeSDF.LocalRaymap");
628631

@@ -631,28 +634,39 @@ void GenerateRayMap()
631634
m_OffsetRayMap[0] = i & 1;
632635
m_OffsetRayMap[1] = (i & 2) >> 1;
633636
m_OffsetRayMap[2] = (i & 4) >> 2;
637+
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.generateRayMapLocal, ShaderProperties.rayMap, GetRayMapPrincipal(m_RayMapUseCounter));
638+
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.generateRayMapLocal, ShaderProperties.rayMapTmp, GetRayMapBis(m_RayMapUseCounter));
634639
m_Cmd.SetComputeIntParams(m_computeShader, ShaderProperties.offsetRayMap, m_OffsetRayMap);
635640
m_Cmd.DispatchCompute(m_computeShader, m_Kernels.generateRayMapLocal,
636-
Mathf.CeilToInt(m_Dimensions[0] / (2.0f * 8.0f)),
637-
Mathf.CeilToInt(m_Dimensions[1] / (2.0f * 8.0f)),
638-
Mathf.CeilToInt(m_Dimensions[2] / (2.0f * 8.0f)));
641+
Mathf.CeilToInt(m_Dimensions[0] / (2.0f * 4.0f)),
642+
Mathf.CeilToInt(m_Dimensions[1] / (2.0f * 4.0f)),
643+
Mathf.CeilToInt(m_Dimensions[2] / (2.0f * 4.0f)));
644+
m_RayMapUseCounter++;
639645
}
646+
640647
m_Cmd.EndSample("BakeSDF.LocalRaymap");
641648

642649
m_Cmd.BeginSample("BakeSDF.GlobalRaymap");
643650

644-
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.rayMapScanX, ShaderProperties.rayMap, m_RayMap);
645-
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.rayMapScanY, ShaderProperties.rayMap, m_RayMap);
646-
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.rayMapScanZ, ShaderProperties.rayMap, m_RayMap);
647-
651+
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.rayMapScanX, ShaderProperties.rayMap, GetRayMapPrincipal(m_RayMapUseCounter));
652+
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.rayMapScanX, ShaderProperties.rayMapTmp, GetRayMapBis(m_RayMapUseCounter));
648653
m_Cmd.DispatchCompute(m_computeShader, m_Kernels.rayMapScanX,
649654
1,
650655
Mathf.CeilToInt(m_Dimensions[1] / 8.0f),
651656
Mathf.CeilToInt(m_Dimensions[2] / 8.0f));
657+
m_RayMapUseCounter++;
658+
659+
660+
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.rayMapScanY, ShaderProperties.rayMap, GetRayMapPrincipal(m_RayMapUseCounter));
661+
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.rayMapScanY, ShaderProperties.rayMapTmp, GetRayMapBis(m_RayMapUseCounter));
652662
m_Cmd.DispatchCompute(m_computeShader, m_Kernels.rayMapScanY,
653663
Mathf.CeilToInt(m_Dimensions[0] / 8.0f),
654664
1,
655665
Mathf.CeilToInt(m_Dimensions[2] / 8.0f));
666+
m_RayMapUseCounter++;
667+
668+
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.rayMapScanZ, ShaderProperties.rayMap, GetRayMapPrincipal(m_RayMapUseCounter));
669+
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.rayMapScanZ, ShaderProperties.rayMapTmp, GetRayMapBis(m_RayMapUseCounter));
656670
m_Cmd.DispatchCompute(m_computeShader, m_Kernels.rayMapScanZ,
657671
Mathf.CeilToInt(m_Dimensions[0] / 8.0f),
658672
Mathf.CeilToInt(m_Dimensions[1] / 8.0f),
@@ -662,35 +676,20 @@ void GenerateRayMap()
662676
m_Cmd.EndSample("BakeSDF.Raymap");
663677
}
664678

665-
RenderTexture GetSignMapPrincipal(int step)
666-
{
667-
if (step % 2 == 0)
668-
{
669-
return m_SignMap;
670-
}
671-
672-
return m_SignMapBis;
673-
}
674-
675-
RenderTexture GetSignMapBis(int step)
676-
{
677-
if (step % 2 == 0)
678-
{
679-
return m_SignMapBis;
680-
}
681-
682-
return m_SignMap;
683-
}
679+
RenderTexture GetRayMapPrincipal(int step) { return m_RayMaps[step % 2]; }
680+
RenderTexture GetRayMapBis(int step) { return m_RayMaps[(step+1) % 2]; }
681+
RenderTexture GetSignMapPrincipal(int step) { return m_SignMaps[step % 2]; }
682+
RenderTexture GetSignMapBis(int step) { return m_SignMaps[(step+1) % 2]; }
684683

685684
void SignPass()
686685
{
687686
m_Cmd.BeginSample("BakeSDF.SignPass");
688-
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.signPass6Rays, ShaderProperties.rayMap, m_RayMap);
687+
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.signPass6Rays, ShaderProperties.rayMap, GetRayMapPrincipal(m_RayMapUseCounter));
689688
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.signPass6Rays, ShaderProperties.signMap, GetSignMapPrincipal(0));
690689
m_Cmd.DispatchCompute(m_computeShader, m_Kernels.signPass6Rays, Mathf.CeilToInt(m_Dimensions[0] / 4.0f),
691690
Mathf.CeilToInt(m_Dimensions[1] / 4.0f), Mathf.CeilToInt(m_Dimensions[2] / 4.0f));
692691

693-
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.signPassNeighbors, ShaderProperties.rayMap, m_RayMap);
692+
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.signPassNeighbors, ShaderProperties.rayMap, GetRayMapPrincipal(m_RayMapUseCounter));
694693
int neighboursCount = 8;
695694
float normalizeFactor = 6.0f;
696695
m_Cmd.SetComputeFloatParam(m_computeShader, ShaderProperties.normalizeFactor, normalizeFactor);
@@ -922,9 +921,10 @@ private void ClearRenderTexturesAndBuffers()
922921
m_Cmd.BeginSample("BakeSDF.ClearTexturesAndBuffers");
923922
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.clearTexturesAndBuffers, ShaderProperties.voxelsTexture, m_textureVoxel, 0);
924923
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.clearTexturesAndBuffers, ShaderProperties.voxelsTmpTexture, m_textureVoxelBis, 0);
925-
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.clearTexturesAndBuffers, ShaderProperties.rayMap, m_RayMap, 0);
926-
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.clearTexturesAndBuffers, ShaderProperties.signMap, m_SignMap, 0);
927-
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.clearTexturesAndBuffers, ShaderProperties.signMapTmp, m_SignMapBis);
924+
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.clearTexturesAndBuffers, ShaderProperties.rayMap, m_RayMaps[0], 0);
925+
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.clearTexturesAndBuffers, ShaderProperties.rw_rayMapTmp, m_RayMaps[1], 0);
926+
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.clearTexturesAndBuffers, ShaderProperties.signMap, m_SignMaps[0], 0);
927+
m_Cmd.SetComputeTextureParam(m_computeShader, m_Kernels.clearTexturesAndBuffers, ShaderProperties.signMapTmp, m_SignMaps[1]);
928928

929929
m_Cmd.SetComputeBufferParam(m_computeShader, m_Kernels.clearTexturesAndBuffers, ShaderProperties.voxelsBuffer, m_bufferVoxel);
930930

@@ -954,7 +954,6 @@ private void PerformDistanceTransformWinding()
954954
m_Cmd.EndSample("BakeSDF.DistanceTransform");
955955
}
956956

957-
private RenderTexture RayMap => m_RayMap;
958957
private void ReleaseBuffersAndTextures()
959958
{
960959
//Release textures.
@@ -964,11 +963,17 @@ private void ReleaseBuffersAndTextures()
964963
for (var i = 0; i < 3; i++)
965964
{
966965
ReleaseRenderTexture(ref m_RenderTextureViews[i]);
967-
Object.Destroy(m_Material[i]);
966+
if(Application.isPlaying)
967+
Object.Destroy(m_Material[i]);
968+
else
969+
Object.DestroyImmediate(m_Material[i]);
970+
}
971+
972+
for (int i = 0; i < 2; i++)
973+
{
974+
ReleaseRenderTexture(ref m_SignMaps[i]);
975+
ReleaseRenderTexture(ref m_RayMaps[i]);
968976
}
969-
ReleaseRenderTexture(ref m_SignMap);
970-
ReleaseRenderTexture(ref m_SignMapBis);
971-
ReleaseRenderTexture(ref m_RayMap);
972977

973978
//Release buffers.
974979
ReleaseGraphicsBuffer(ref m_bufferVoxel);
@@ -1076,7 +1081,10 @@ private void ReleaseRenderTexture(ref RenderTexture rt)
10761081
if (rt != null)
10771082
{
10781083
rt.Release();
1079-
Object.DestroyImmediate(rt);
1084+
if(Application.isPlaying)
1085+
Object.Destroy(rt);
1086+
else
1087+
Object.DestroyImmediate(rt);
10801088
}
10811089
rt = null;
10821090
}
@@ -1109,6 +1117,8 @@ static class ShaderProperties
11091117
internal static int voxelsTexture = Shader.PropertyToID("voxels");
11101118
internal static int voxelsTmpTexture = Shader.PropertyToID("voxelsTmp");
11111119
internal static int rayMap = Shader.PropertyToID("rayMap");
1120+
internal static int rayMapTmp = Shader.PropertyToID("rayMapTmp");
1121+
internal static int rw_rayMapTmp = Shader.PropertyToID("rw_rayMapTmp");
11121122
internal static int nTriangles = Shader.PropertyToID("nTriangles");
11131123
internal static int minBoundsExtended = Shader.PropertyToID("minBoundsExtended");
11141124
internal static int maxBoundsExtended = Shader.PropertyToID("maxBoundsExtended");

0 commit comments

Comments
 (0)