Skip to content

Commit 3a87d2e

Browse files
committed
Move morton code construction and destruction to common code
1 parent 50cfe22 commit 3a87d2e

3 files changed

Lines changed: 22 additions & 19 deletions

File tree

‎engine/shaders/marching_cubes.comp.glsl‎

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ layout(constant_id = 0) const uint thresholdsCountConst = 0u;
1717
layout(local_size_x = 8, local_size_y = 8, local_size_z = 8) in;
1818

1919
#include "descriptor_sets.inc.glsl"
20+
#include "frame_set_common.inc.glsl"
21+
#include "morton_code.inc.glsl"
2022

2123
layout(set = DESCRIPTOR_SET_FREQUENT, binding = 0, std430) uniform EdgeTable {
2224
uint[256u] edges;
@@ -49,9 +51,6 @@ layout(set = DESCRIPTOR_SET_FREQUENT, binding = 5, scalar) buffer bufferatomics
4951
IndirectCommand[] commands;
5052
};
5153

52-
layout(set = DESCRIPTOR_SET_FREQUENT, binding = 6) uniform sampler linearSampler;
53-
layout(set = DESCRIPTOR_SET_FREQUENT, binding = 7) uniform sampler nearestSampler;
54-
5554
layout(set = DESCRIPTOR_SET_FREQUENT, binding = 8) uniform texture3D densityImageMin;
5655
layout(set = DESCRIPTOR_SET_FREQUENT, binding = 9) uniform texture3D densityImageMax;
5756

@@ -73,15 +72,8 @@ uvec3 indexOffset(uint idx) {
7372

7473
uint vertexKey(uvec3 pos1, uvec3 pos2) {
7574
uvec3 pos = pos1 + pos2;
76-
77-
uvec3 sizes = uvec3(512u * 2u + 1u);
78-
pos = min(sizes - uvec3(1u), pos);
79-
80-
uint key = pos.z * sizes.x * sizes.y +
81-
pos.y * sizes.x +
82-
pos.x;
83-
84-
return key;
75+
uvec3 size = uvec3(512u * 2u + 1u);
76+
return mortonCode(pos, size);
8577
}
8678

8779
uint vertexKeyFromIndexOffsets(uint idx1, uint idx2) {
@@ -145,7 +137,7 @@ void main() {
145137
if (!any(greaterThanEqual(gl_LocalInvocationID, gl_WorkGroupSize - uvec3(1u)))) {
146138
uvec3 lowResPos = workgroupBase / uvec3(8u);
147139
// Workgroup 8x8x8 => +3 mip levels but min/max textures don't have the top mip level, so +2
148-
float densityMax = texelFetch(sampler3D(densityImageMax, nearestSampler), ivec3(lowResPos), int(lod + 2u)).x;
140+
float densityMax = texelFetch(sampler3D(densityImageMax, samplerNearest), ivec3(lowResPos), int(lod + 2u)).x;
149141
bool empty = true;
150142
bool full = true;
151143
for (uint i = 0u; i < finalThresholdsCount; i++) {
@@ -169,7 +161,7 @@ void main() {
169161
uvec3 offset = uvec3(x, y, z);
170162

171163
uvec3 pos = base + offset;
172-
float density = texelFetch(sampler3D(densityImage, nearestSampler), ivec3(pos), int(lod)).x;
164+
float density = texelFetch(sampler3D(densityImage, samplerNearest), ivec3(pos), int(lod)).x;
173165

174166
uint index = ((x + z) & 1u) + z * 2u + y * 4u;
175167

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
uint mortonCode(uvec3 vector, uvec3 size) {
2+
vector = min(size, vector);
3+
4+
return vector.z * size.x * size.y +
5+
vector.y * size.x +
6+
vector.x;
7+
}
8+
9+
uvec3 vectorFromMortonCode(uint mortonCode, uvec3 size) {
10+
return uvec3(mortonCode % size.x,
11+
(mortonCode / size.x) % size.y,
12+
mortonCode / (size.x * size.y));
13+
}

‎engine/shaders/volume_geometry.vert.glsl‎

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "descriptor_sets.inc.glsl"
66
#include "camera.inc.glsl"
77
#include "frame_set_volume.inc.glsl"
8+
#include "morton_code.inc.glsl"
89

910
layout(location = 0) out float out_density;
1011
layout(location = 1) out vec3 out_worldPosition;
@@ -39,11 +40,8 @@ vec4 interpolateVertices(uvec3 pos1, uvec3 pos2) {
3940

4041

4142
vec4 vertexPosFromKey(uint vertexKey) {
42-
uvec3 sizes = uvec3(512u * 2u + 1u);
43-
44-
uvec3 pos = uvec3(vertexKey % sizes.x,
45-
(vertexKey / sizes.x) % sizes.y,
46-
vertexKey / (sizes.x * sizes.y));
43+
uvec3 size = uvec3(512u * 2u + 1u);
44+
uvec3 pos = vectorFromMortonCode(vertexKey, size);
4745

4846
uvec3 pos1 = pos / 2u;
4947
uvec3 pos2 = pos1 + (pos % 2u);

0 commit comments

Comments
 (0)