EEVEE-Next: Precompute AO/GI quality factor

This avoid some ALU in hot loops of expensive shaders.
This commit is contained in:
Clément Foucault 2024-05-27 17:09:54 +02:00
parent 66af5ed445
commit 8aec5f5e91
4 changed files with 4 additions and 4 deletions

View File

@ -42,7 +42,7 @@ void AmbientOcclusion::init()
data_.distance = sce_eevee.gtao_distance;
data_.gi_distance = (sce_eevee.fast_gi_distance > 0.0f) ? sce_eevee.fast_gi_distance : 1e16f;
data_.quality = sce_eevee.gtao_quality;
data_.lod_factor = 1.0f / (1.0f + sce_eevee.gtao_quality * 4.0f);
data_.thickness = sce_eevee.gtao_thickness;
data_.angle_bias = 1.0 / max_ff(1e-8f, 1.0 - sce_eevee.gtao_focus);
/* Size is multiplied by 2 because it is applied in NDC [-1..1] range. */

View File

@ -1932,7 +1932,7 @@ BLI_STATIC_ASSERT_ALIGN(RayTraceData, 16)
struct AOData {
float2 pixel_size;
float distance;
float quality;
float lod_factor;
float thickness;
float angle_bias;

View File

@ -105,7 +105,7 @@ float ambient_ambient_occlusion_search_horizon(vec3 vI,
/* Gives us good precision at center and ensure we cross at least one pixel per iteration. */
time = 1.0 + iter + square((iter + noise) / sample_count) * ssray.max_time;
float stride = time - prev_time;
float lod = (log2(stride) - noise) / (1.0 + uniform_buf.ao.quality);
float lod = (log2(stride) - noise) * uniform_buf.ao.lod_factor;
vec2 uv = ssray.origin.xy + ssray.direction.xy * time;
float depth = textureLod(depth_tx, uv * uniform_buf.hiz.uv_scale, floor(lod)).r;

View File

@ -169,7 +169,7 @@ HorizonScanResult horizon_scan_eval(vec3 vP,
time += 1.0;
}
float lod = 1.0 + (float(j >> 2) / (1.0 + uniform_buf.ao.quality));
float lod = 1.0 + float(j >> 2) * uniform_buf.ao.lod_factor;
vec2 sample_uv = ssray.origin.xy + ssray.direction.xy * time;
float sample_depth = textureLod(hiz_tx, sample_uv * uniform_buf.hiz.uv_scale, lod).r;