@@ -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