1
0
Fork 0

HDR: Increase maximum distance of aerial perspective

This commit is contained in:
Fernando García Liñán 2021-07-31 18:50:18 +02:00
parent 467468ef3a
commit 4d34115177
3 changed files with 9 additions and 10 deletions

View file

@ -101,7 +101,7 @@
<buffer> <buffer>
<name>aerial-perspective</name> <name>aerial-perspective</name>
<type>2d</type> <type>2d</type>
<width>512</width> <width>1024</width>
<height>32</height> <height>32</height>
<format>rgba16f</format> <format>rgba16f</format>
<min-filter>linear</min-filter> <min-filter>linear</min-filter>

View file

@ -26,8 +26,8 @@ uniform sampler2D multiscattering_lut;
const float PI = 3.141592653; const float PI = 3.141592653;
const float ATMOSPHERE_RADIUS = 6471e3; const float ATMOSPHERE_RADIUS = 6471e3;
const float TOTAL_SLICES = 16.0; const float TOTAL_SLICES = 32.0;
const float DEPTH_RANGE = 32000.0; const float DEPTH_RANGE = 128000.0;
const int AERIAL_PERSPECTIVE_SAMPLES = 20; const int AERIAL_PERSPECTIVE_SAMPLES = 20;
const vec3 ONE_OVER_THREE = vec3(1.0 / 3.0); const vec3 ONE_OVER_THREE = vec3(1.0 / 3.0);

View file

@ -44,10 +44,10 @@ const vec2 uv_shifts[4] = vec2[4](
vec2(0.0, 0.5), vec2(0.5, 0.5)); vec2(0.0, 0.5), vec2(0.5, 0.5));
const vec2 uv_factor = vec2(0.5, 0.5); const vec2 uv_factor = vec2(0.5, 0.5);
const float AERIAL_SLICES = 16.0; const float AERIAL_SLICES = 32.0;
const float AERIAL_LUT_TILE_SIZE = 1.0 / AERIAL_SLICES; const float AERIAL_LUT_TILE_SIZE = 1.0 / AERIAL_SLICES;
const float AERIAL_LUT_TEXEL_SIZE = 1.0 / 512.0; const float AERIAL_LUT_TEXEL_SIZE = 1.0 / 1024.0;
const float AERIAL_MAX_DEPTH = 32000.0; const float AERIAL_MAX_DEPTH = 128000.0;
const float MAX_PREFILTERED_LOD = 4.0; const float MAX_PREFILTERED_LOD = 4.0;
@ -348,17 +348,16 @@ vec4 sampleAerialPerspective(float depth)
float w = depth / AERIAL_MAX_DEPTH; float w = depth / AERIAL_MAX_DEPTH;
// Squared distribution // Squared distribution
w = sqrt(clamp(w, 0.0, 1.0)); w = sqrt(clamp(w, 0.0, 1.0));
// Remap to [0,16] to sample the right tile
w *= AERIAL_SLICES; w *= AERIAL_SLICES;
if (w <= 1.0) { if (w <= 1.0) {
// Handle special case of fragments behind the first slice // Handle special case of fragments behind the first slice
color = mix(vec4(0.0, 0.0, 0.0, 1.0), sampleAerialPerspectiveSlice(0), w); color = mix(vec4(0.0, 0.0, 0.0, 1.0), sampleAerialPerspectiveSlice(0), w);
} else { } else {
w -= 1.0; // [0,15] w -= 1.0;
// Manually linearly interpolate between slices // Manually interpolate between slices
color = mix(sampleAerialPerspectiveSlice(int(floor(w))), color = mix(sampleAerialPerspectiveSlice(int(floor(w))),
sampleAerialPerspectiveSlice(int(ceil(w))), sampleAerialPerspectiveSlice(int(ceil(w))),
fract(w)); sqrt(fract(w)));
} }
return color; return color;
} }