Initial commit: Minecraft 光追着色器包(从零实现的 path tracing)
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
// 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);
|
||||
}
|
||||
Reference in New Issue
Block a user