EEVEE-Next: Precompute AO/GI quality factor
This avoid some ALU in hot loops of expensive shaders.
This commit is contained in:
parent
66af5ed445
commit
8aec5f5e91
@ -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. */
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user