Files
minecraft-pt/shaders/Lib/Programs/Composite/VoxelData_Copy_CS.glsl
T

93 lines
2.8 KiB
GLSL

// 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);
}