Skip to content

Commit 5d4a8e4

Browse files
committed
Update voxelizing flow. (Fill front surface before back surface)
1 parent 30bc4c8 commit 5d4a8e4

File tree

6 files changed

+132
-135
lines changed

6 files changed

+132
-135
lines changed

Assets/Packages/Voxelizer/Demo/Materials/VoxelWave.mat

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,11 @@ Material:
6969
- _SmoothnessTextureChannel: 0
7070
- _SpecularHighlights: 1
7171
- _SrcBlend: 1
72+
- _Threshold: 0
7273
- _UVSec: 0
7374
- _ZWrite: 1
7475
m_Colors:
7576
- _Color: {r: 1, g: 1, b: 1, a: 1}
7677
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
78+
- _Range: {r: -10, g: 10, b: 0, a: 0}
7779
- _Wave: {r: 9.72, g: 0.012, b: -1, a: -1}

Assets/Packages/Voxelizer/Scripts/CPUVoxelizer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ public static void Voxelize (Mesh mesh, int resolution, out List<Voxel_t> voxels
154154
{
155155
for(int z = 0; z < depth; z++)
156156
{
157-
if (volume[x, y, z].IsCavity()) continue;
157+
if (volume[x, y, z].IsEmpty()) continue;
158158

159159
int ifront = z;
160160

@@ -171,7 +171,7 @@ public static void Voxelize (Mesh mesh, int resolution, out List<Voxel_t> voxels
171171
var iback = ifront;
172172

173173
// step forward to cavity
174-
for (; iback < depth && volume[x, y, iback].IsCavity(); iback++) {}
174+
for (; iback < depth && volume[x, y, iback].IsEmpty(); iback++) {}
175175

176176
if (iback >= depth) break;
177177

@@ -201,7 +201,7 @@ public static void Voxelize (Mesh mesh, int resolution, out List<Voxel_t> voxels
201201
for(int x = 0; x < width; x++) {
202202
for(int y = 0; y < height; y++) {
203203
for(int z = 0; z < depth; z++) {
204-
if(!volume[x, y, z].IsCavity())
204+
if(!volume[x, y, z].IsEmpty())
205205
{
206206
voxels.Add(volume[x, y, z]);
207207
}

Assets/Packages/Voxelizer/Scripts/GPUVoxelizer.cs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace VoxelSystem {
1111

1212
public class GPUVoxelizer {
1313

14-
protected const string kVolumeKernelKey = "Volume", kSurfaceKernelKey = "Surface", kTextureKernelKey = "BuildTexture3D";
14+
protected const string kVolumeKernelKey = "Volume", kSurfaceFrontKernelKey = "SurfaceFront", kSurfaceBackKernelKey = "SurfaceBack", kTextureKernelKey = "BuildTexture3D";
1515
protected const string kStartKey = "_Start", kEndKey = "_End", kSizeKey = "_Size";
1616
protected const string kUnitKey = "_Unit", kInvUnitKey = "_InvUnit", kHalfUnitKey = "_HalfUnit";
1717
protected const string kWidthKey = "_Width", kHeightKey = "_Height", kDepthKey = "_Depth";
@@ -88,21 +88,31 @@ public static GPUVoxelData Voxelize(ComputeShader voxelizer, Mesh mesh, Bounds b
8888
voxelizer.SetInt(kDepthKey, d);
8989

9090
// send mesh data
91-
var surfaceKer = new Kernel(voxelizer, kSurfaceKernelKey);
92-
voxelizer.SetBuffer(surfaceKer.Index, kVertBufferKey, vertBuffer);
93-
voxelizer.SetBuffer(surfaceKer.Index, kUVBufferKey, uvBuffer);
9491
voxelizer.SetInt(kTriCountKey, triBuffer.count);
9592
var indexes = triBuffer.count / 3;
9693
voxelizer.SetInt(kTriIndexesKey, indexes);
97-
voxelizer.SetBuffer(surfaceKer.Index, kTriBufferKey, triBuffer);
98-
voxelizer.SetBuffer(surfaceKer.Index, kVoxelBufferKey, voxelBuffer);
99-
voxelizer.Dispatch(surfaceKer.Index, indexes / (int)surfaceKer.ThreadX + 1, (int)surfaceKer.ThreadY, (int)surfaceKer.ThreadZ);
94+
95+
// surface front
96+
var surfaceFrontKer = new Kernel(voxelizer, kSurfaceFrontKernelKey);
97+
voxelizer.SetBuffer(surfaceFrontKer.Index, kVertBufferKey, vertBuffer);
98+
voxelizer.SetBuffer(surfaceFrontKer.Index, kUVBufferKey, uvBuffer);
99+
voxelizer.SetBuffer(surfaceFrontKer.Index, kTriBufferKey, triBuffer);
100+
voxelizer.SetBuffer(surfaceFrontKer.Index, kVoxelBufferKey, voxelBuffer);
101+
voxelizer.Dispatch(surfaceFrontKer.Index, indexes / (int)surfaceFrontKer.ThreadX + 1, (int)surfaceFrontKer.ThreadY, (int)surfaceFrontKer.ThreadZ);
102+
103+
// surface back
104+
var surfaceBackKer = new Kernel(voxelizer, kSurfaceBackKernelKey);
105+
voxelizer.SetBuffer(surfaceBackKer.Index, kVertBufferKey, vertBuffer);
106+
voxelizer.SetBuffer(surfaceBackKer.Index, kUVBufferKey, uvBuffer);
107+
voxelizer.SetBuffer(surfaceBackKer.Index, kTriBufferKey, triBuffer);
108+
voxelizer.SetBuffer(surfaceBackKer.Index, kVoxelBufferKey, voxelBuffer);
109+
voxelizer.Dispatch(surfaceBackKer.Index, indexes / (int)surfaceBackKer.ThreadX + 1, (int)surfaceBackKer.ThreadY, (int)surfaceBackKer.ThreadZ);
100110

101111
if(volume)
102112
{
103113
var volumeKer = new Kernel(voxelizer, kVolumeKernelKey);
104114
voxelizer.SetBuffer(volumeKer.Index, kVoxelBufferKey, voxelBuffer);
105-
voxelizer.Dispatch(volumeKer.Index, w / (int)volumeKer.ThreadX + 1, h / (int)volumeKer.ThreadY + 1, (int)surfaceKer.ThreadZ);
115+
voxelizer.Dispatch(volumeKer.Index, w / (int)volumeKer.ThreadX + 1, h / (int)volumeKer.ThreadY + 1, (int)surfaceFrontKer.ThreadZ);
106116
}
107117

108118
// dispose

Assets/Packages/Voxelizer/Scripts/Voxel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public bool IsBackFace()
2525
return fill > 0 && front > 0;
2626
}
2727

28-
public bool IsCavity()
28+
public bool IsEmpty()
2929
{
3030
return fill < 1;
3131
}

Assets/Packages/Voxelizer/Shaders/Voxel.cginc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ bool is_back_voxel(Voxel v)
1818
return v.fill && !v.front;
1919
}
2020

21-
bool is_cavity_voxel(Voxel v)
21+
bool is_empty_voxel(Voxel v)
2222
{
2323
return !v.fill;
2424
}

0 commit comments

Comments
 (0)