2023-02-08 14:40:15 +01:00
|
|
|
|
2024-08-15 20:29:14 +02:00
|
|
|
const int voxelgi_resolution = 256;
|
|
|
|
|
const vec3 voxelgi_half_extents = vec3(1, 1, 1);
|
|
|
|
|
const float voxelgi_occ = 1.0;
|
|
|
|
|
const float voxelgi_step = 1.0;
|
|
|
|
|
const float voxelgi_range = 2.0;
|
|
|
|
|
const float MAX_DISTANCE = 1.73205080757 * voxelgi_range;
|
2024-10-15 23:24:15 +02:00
|
|
|
const float VOXEL_SIZE = (2.0 / voxelgi_resolution) * voxelgi_step;
|
2023-02-08 14:40:15 +01:00
|
|
|
|
|
|
|
|
vec3 tangent(const vec3 n) {
|
|
|
|
|
vec3 t1 = cross(n, vec3(0, 0, 1));
|
|
|
|
|
vec3 t2 = cross(n, vec3(0, 1, 0));
|
|
|
|
|
if (length(t1) > length(t2)) return normalize(t1);
|
|
|
|
|
else return normalize(t2);
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-15 20:29:14 +02:00
|
|
|
float trace_cone_ao(sampler3D voxels, const vec3 origin, vec3 dir, const float aperture, const float max_dist) {
|
2023-02-08 14:40:15 +01:00
|
|
|
dir = normalize(dir);
|
2024-08-15 20:29:14 +02:00
|
|
|
float sample_col = 0.0;
|
|
|
|
|
float dist = 1.5 * VOXEL_SIZE * cone_offset;
|
2023-02-08 14:40:15 +01:00
|
|
|
float diam = dist * aperture;
|
2024-08-15 20:29:14 +02:00
|
|
|
vec3 sample_pos;
|
|
|
|
|
while (sample_col < 1.0 && dist < max_dist) {
|
|
|
|
|
sample_pos = dir * dist + origin;
|
2024-10-15 23:24:15 +02:00
|
|
|
float mip = max(log2(diam * voxelgi_resolution), 0.0);
|
2024-10-02 23:17:50 +02:00
|
|
|
float mip_sample = textureLod(voxels, sample_pos * 0.5 + vec3(0.5, 0.5, 0.5), mip).r;
|
2024-08-15 20:29:14 +02:00
|
|
|
sample_col += (1 - sample_col) * mip_sample;
|
2023-02-08 14:40:15 +01:00
|
|
|
dist += max(diam / 2, VOXEL_SIZE);
|
|
|
|
|
diam = dist * aperture;
|
|
|
|
|
}
|
2024-08-15 20:29:14 +02:00
|
|
|
return sample_col;
|
2023-02-08 14:40:15 +01:00
|
|
|
}
|
|
|
|
|
|
2024-08-15 20:29:14 +02:00
|
|
|
float trace_shadow(sampler3D voxels, const vec3 origin, const vec3 dir) {
|
|
|
|
|
return trace_cone_ao(voxels, origin, dir, 0.14 * cone_aperture, 2.5 * voxelgi_range);
|
2023-02-08 14:40:15 +01:00
|
|
|
}
|
|
|
|
|
|
2024-08-15 20:29:14 +02:00
|
|
|
float trace_ao(const vec3 origin, const vec3 normal, sampler3D voxels) {
|
|
|
|
|
const float angle_mix = 0.5f;
|
2023-02-08 14:40:15 +01:00
|
|
|
const float aperture = 0.55785173935;
|
|
|
|
|
vec3 o1 = normalize(tangent(normal));
|
|
|
|
|
vec3 o2 = normalize(cross(o1, normal));
|
|
|
|
|
vec3 c1 = 0.5f * (o1 + o2);
|
|
|
|
|
vec3 c2 = 0.5f * (o1 - o2);
|
|
|
|
|
|
2024-10-15 23:24:15 +02:00
|
|
|
#ifdef HLSL
|
2024-08-15 20:29:14 +02:00
|
|
|
const float factor = voxelgi_occ * 0.93;
|
2024-10-15 23:24:15 +02:00
|
|
|
#else
|
2024-08-15 20:29:14 +02:00
|
|
|
const float factor = voxelgi_occ * 0.90;
|
2024-10-15 23:24:15 +02:00
|
|
|
#endif
|
2023-02-08 14:40:15 +01:00
|
|
|
|
2024-08-15 20:29:14 +02:00
|
|
|
float col = trace_cone_ao(voxels, origin, normal, aperture, MAX_DISTANCE);
|
|
|
|
|
col += trace_cone_ao(voxels, origin, mix(normal, o1, angle_mix), aperture, MAX_DISTANCE);
|
|
|
|
|
col += trace_cone_ao(voxels, origin, mix(normal, o2, angle_mix), aperture, MAX_DISTANCE);
|
|
|
|
|
col += trace_cone_ao(voxels, origin, mix(normal, -c1, angle_mix), aperture, MAX_DISTANCE);
|
|
|
|
|
col += trace_cone_ao(voxels, origin, mix(normal, -c2, angle_mix), aperture, MAX_DISTANCE);
|
2023-02-08 14:40:15 +01:00
|
|
|
return (col / 5.0) * factor;
|
|
|
|
|
|
|
|
|
|
return 0.0;
|
|
|
|
|
}
|