@@ -13,7 +13,7 @@ namespace UnityEngine.VFX.SDF
13
13
/// </summary>
14
14
public class MeshToSDFBaker : IDisposable
15
15
{
16
- private RenderTexture m_RayMap , m_SignMap , m_SignMapBis ;
16
+ private RenderTexture [ ] m_RayMaps , m_SignMaps ;
17
17
private RenderTexture [ ] m_RenderTextureViews ;
18
18
private GraphicsBuffer m_CounterBuffer , m_AccumCounterBuffer , m_TrianglesInVoxels , m_TrianglesUV ;
19
19
private GraphicsBuffer
@@ -55,6 +55,8 @@ private GraphicsBuffer
55
55
private float [ ] m_MinBoundsExtended = new float [ 3 ] ;
56
56
private float [ ] m_MaxBoundsExtended = new float [ 3 ] ;
57
57
58
+ private int m_RayMapUseCounter = 0 ;
59
+
58
60
internal static uint kMaxRecommandedGridSize = 1 << 24 ;
59
61
internal static uint kMaxAbsoluteGridSize = 1 << 27 ;
60
62
@@ -347,15 +349,16 @@ void InitTextures()
347
349
348
350
CreateRenderTextureIfNeeded ( ref m_textureVoxel , rtDesc4Channels ) ;
349
351
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
+ }
353
359
354
360
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 ) ) ;
359
362
InitPrefixSumBuffers ( ) ;
360
363
}
361
364
@@ -618,11 +621,11 @@ void JFA()
618
621
619
622
void GenerateRayMap ( )
620
623
{
624
+ m_RayMapUseCounter = 0 ;
621
625
m_Cmd . BeginSample ( "BakeSDF.Raymap" ) ;
622
626
m_Cmd . SetComputeBufferParam ( m_computeShader , m_Kernels . generateRayMapLocal , ShaderProperties . accumCounter , m_AccumCounterBuffer ) ;
623
627
m_Cmd . SetComputeBufferParam ( m_computeShader , m_Kernels . generateRayMapLocal , ShaderProperties . triangleIDs , m_TrianglesInVoxels ) ;
624
628
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 ) ;
626
629
627
630
m_Cmd . BeginSample ( "BakeSDF.LocalRaymap" ) ;
628
631
@@ -631,28 +634,39 @@ void GenerateRayMap()
631
634
m_OffsetRayMap [ 0 ] = i & 1 ;
632
635
m_OffsetRayMap [ 1 ] = ( i & 2 ) >> 1 ;
633
636
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 ) ) ;
634
639
m_Cmd . SetComputeIntParams ( m_computeShader , ShaderProperties . offsetRayMap , m_OffsetRayMap ) ;
635
640
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 ++ ;
639
645
}
646
+
640
647
m_Cmd . EndSample ( "BakeSDF.LocalRaymap" ) ;
641
648
642
649
m_Cmd . BeginSample ( "BakeSDF.GlobalRaymap" ) ;
643
650
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 ) ) ;
648
653
m_Cmd . DispatchCompute ( m_computeShader , m_Kernels . rayMapScanX ,
649
654
1 ,
650
655
Mathf . CeilToInt ( m_Dimensions [ 1 ] / 8.0f ) ,
651
656
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 ) ) ;
652
662
m_Cmd . DispatchCompute ( m_computeShader , m_Kernels . rayMapScanY ,
653
663
Mathf . CeilToInt ( m_Dimensions [ 0 ] / 8.0f ) ,
654
664
1 ,
655
665
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 ) ) ;
656
670
m_Cmd . DispatchCompute ( m_computeShader , m_Kernels . rayMapScanZ ,
657
671
Mathf . CeilToInt ( m_Dimensions [ 0 ] / 8.0f ) ,
658
672
Mathf . CeilToInt ( m_Dimensions [ 1 ] / 8.0f ) ,
@@ -662,35 +676,20 @@ void GenerateRayMap()
662
676
m_Cmd . EndSample ( "BakeSDF.Raymap" ) ;
663
677
}
664
678
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 ] ; }
684
683
685
684
void SignPass ( )
686
685
{
687
686
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 ) ) ;
689
688
m_Cmd . SetComputeTextureParam ( m_computeShader , m_Kernels . signPass6Rays , ShaderProperties . signMap , GetSignMapPrincipal ( 0 ) ) ;
690
689
m_Cmd . DispatchCompute ( m_computeShader , m_Kernels . signPass6Rays , Mathf . CeilToInt ( m_Dimensions [ 0 ] / 4.0f ) ,
691
690
Mathf . CeilToInt ( m_Dimensions [ 1 ] / 4.0f ) , Mathf . CeilToInt ( m_Dimensions [ 2 ] / 4.0f ) ) ;
692
691
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 ) ) ;
694
693
int neighboursCount = 8 ;
695
694
float normalizeFactor = 6.0f ;
696
695
m_Cmd . SetComputeFloatParam ( m_computeShader , ShaderProperties . normalizeFactor , normalizeFactor ) ;
@@ -922,9 +921,10 @@ private void ClearRenderTexturesAndBuffers()
922
921
m_Cmd . BeginSample ( "BakeSDF.ClearTexturesAndBuffers" ) ;
923
922
m_Cmd . SetComputeTextureParam ( m_computeShader , m_Kernels . clearTexturesAndBuffers , ShaderProperties . voxelsTexture , m_textureVoxel , 0 ) ;
924
923
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 ] ) ;
928
928
929
929
m_Cmd . SetComputeBufferParam ( m_computeShader , m_Kernels . clearTexturesAndBuffers , ShaderProperties . voxelsBuffer , m_bufferVoxel ) ;
930
930
@@ -954,7 +954,6 @@ private void PerformDistanceTransformWinding()
954
954
m_Cmd . EndSample ( "BakeSDF.DistanceTransform" ) ;
955
955
}
956
956
957
- private RenderTexture RayMap => m_RayMap ;
958
957
private void ReleaseBuffersAndTextures ( )
959
958
{
960
959
//Release textures.
@@ -964,11 +963,17 @@ private void ReleaseBuffersAndTextures()
964
963
for ( var i = 0 ; i < 3 ; i ++ )
965
964
{
966
965
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 ] ) ;
968
976
}
969
- ReleaseRenderTexture ( ref m_SignMap ) ;
970
- ReleaseRenderTexture ( ref m_SignMapBis ) ;
971
- ReleaseRenderTexture ( ref m_RayMap ) ;
972
977
973
978
//Release buffers.
974
979
ReleaseGraphicsBuffer ( ref m_bufferVoxel ) ;
@@ -1076,7 +1081,10 @@ private void ReleaseRenderTexture(ref RenderTexture rt)
1076
1081
if ( rt != null )
1077
1082
{
1078
1083
rt . Release ( ) ;
1079
- Object . DestroyImmediate ( rt ) ;
1084
+ if ( Application . isPlaying )
1085
+ Object . Destroy ( rt ) ;
1086
+ else
1087
+ Object . DestroyImmediate ( rt ) ;
1080
1088
}
1081
1089
rt = null ;
1082
1090
}
@@ -1109,6 +1117,8 @@ static class ShaderProperties
1109
1117
internal static int voxelsTexture = Shader . PropertyToID ( "voxels" ) ;
1110
1118
internal static int voxelsTmpTexture = Shader . PropertyToID ( "voxelsTmp" ) ;
1111
1119
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" ) ;
1112
1122
internal static int nTriangles = Shader . PropertyToID ( "nTriangles" ) ;
1113
1123
internal static int minBoundsExtended = Shader . PropertyToID ( "minBoundsExtended" ) ;
1114
1124
internal static int maxBoundsExtended = Shader . PropertyToID ( "maxBoundsExtended" ) ;
0 commit comments