// MinecraftPT — VoxelData_Copy compute shader // Copies the 2D voxel atlas (shadowcolor1) into the 3D voxel texture, // computing sparse-tracing empty markers for hierarchical ray skipping. #include "/Lib/Settings.glsl" #include "/Lib/Utilities.glsl" #include "/Lib/PathTracing/Voxelizer/VoxelProfile.glsl" #if PT_VOXEL_RESOLUTION == 4004 const ivec3 workGroups = ivec3(16, 16, 16); #elif PT_VOXEL_RESOLUTION == 6004 const ivec3 workGroups = ivec3(24, 16, 24); #elif PT_VOXEL_RESOLUTION == 8004 const ivec3 workGroups = ivec3(32, 16, 32); #elif PT_VOXEL_RESOLUTION == 8006 const ivec3 workGroups = ivec3(32, 24, 32); #elif PT_VOXEL_RESOLUTION == 8008 const ivec3 workGroups = ivec3(32, 32, 32); #elif PT_VOXEL_RESOLUTION == 12004 const ivec3 workGroups = ivec3(48, 16, 48); #elif PT_VOXEL_RESOLUTION == 12006 const ivec3 workGroups = ivec3(48, 24, 48); #elif PT_VOXEL_RESOLUTION == 12008 const ivec3 workGroups = ivec3(48, 32, 48); #elif PT_VOXEL_RESOLUTION == 16004 const ivec3 workGroups = ivec3(64, 16, 64); #elif PT_VOXEL_RESOLUTION == 16008 const ivec3 workGroups = ivec3(64, 32, 64); #elif PT_VOXEL_RESOLUTION == 16016 const ivec3 workGroups = ivec3(64, 64, 64); #else const ivec3 workGroups = ivec3(32, 24, 32); #endif layout (local_size_x = 8, local_size_y = 8, local_size_z = 8) in; layout (rgba16) uniform writeonly image3D img_voxelData3D; #ifdef PT_SPARE_TRACING shared uint isOccupied_8; shared uint isOccupied_4[8]; shared uint isOccupied_2[64]; #endif uniform sampler2D shadowcolor1; void main(){ #ifdef PT_SPARE_TRACING int id_4 = int((gl_LocalInvocationID.x >> 2u) + (gl_LocalInvocationID.y >> 2u) * 2u + (gl_LocalInvocationID.z >> 2u) * 4u); int id_2 = int((gl_LocalInvocationID.x >> 1u) + (gl_LocalInvocationID.y >> 1u) * 4u + (gl_LocalInvocationID.z >> 2u) * 16u); isOccupied_8 = 0u; isOccupied_4[id_4] = 0u; isOccupied_2[id_2] = 0u; barrier(); #endif ivec3 drawTexel = ivec3(gl_GlobalInvocationID.xyz); ivec2 voxelTexel = ivec2(VoxelTexel_From_VoxelCoord(vec3(drawTexel))); vec4 voxelData = texelFetch(shadowcolor1, voxelTexel, 0); // A texel with z >= 1.0 is empty (clear color) if (voxelData.z >= 1.0){ voxelData = vec4(0.0, 0.0, 1.0, 1.0); // empty voxel: encoded ID = 1.0 (air) } #ifdef PT_SPARE_TRACING uint occupied = uint(voxelData.z < 0.999); atomicMax(isOccupied_8, occupied); barrier(); if (isOccupied_8 == 0u){ voxelData.z = 0.91; // 8^3 empty marker }else{ atomicMax(isOccupied_4[id_4], occupied); barrier(); if (isOccupied_4[id_4] == 0u){ voxelData.z = 0.71; // 4^3 empty marker }else{ atomicMax(isOccupied_2[id_2], occupied); barrier(); if (isOccupied_2[id_2] == 0u) voxelData.z = 0.61; // 2^3 empty marker } } #endif imageStore(img_voxelData3D, drawTexel, voxelData); }