From fd34d916312a618ee68971b6a600739e26fe2fe4 Mon Sep 17 00:00:00 2001 From: Fouad Valadbeigi <67509069+akoylasar@users.noreply.github.com> Date: Mon, 20 Mar 2023 23:44:08 +0100 Subject: [PATCH] Flood light walls hot fix (#491) * render test to capture issue * forgotten to move back caculations to fragment shader * review fixes and opacity multiplied in fragment now --- src/shaders/fill_extrusion.fragment.glsl | 19 +++- src/shaders/fill_extrusion.vertex.glsl | 22 ++--- .../flood-light-fixed-radius/expected.png | Bin 0 -> 31745 bytes .../flood-light-fixed-radius/style.json | 84 ++++++++++++++++++ 4 files changed, 113 insertions(+), 12 deletions(-) create mode 100644 test/integration/render-tests/lighting-3d-mode/fill-extrusion/flood-light-fixed-radius/expected.png create mode 100644 test/integration/render-tests/lighting-3d-mode/fill-extrusion/flood-light-fixed-radius/style.json diff --git a/src/shaders/fill_extrusion.fragment.glsl b/src/shaders/fill_extrusion.fragment.glsl index 34acd23c86b..239fbdf04a0 100644 --- a/src/shaders/fill_extrusion.fragment.glsl +++ b/src/shaders/fill_extrusion.fragment.glsl @@ -6,9 +6,11 @@ varying highp vec4 v_pos_light_view_1; varying float v_depth; #endif +uniform lowp float u_opacity; + #ifdef FAUX_AO uniform lowp vec2 u_ao; -varying vec3 v_ao; +varying vec2 v_ao; #endif #ifdef ZERO_ROOF_RADIUS @@ -19,9 +21,15 @@ varying vec4 v_roof_color; varying highp vec3 v_normal; #endif +uniform vec3 u_flood_light_color; uniform highp float u_vertical_scale; +#if defined(LIGHTING_3D_MODE) && defined(FLOOD_LIGHT) +varying float v_flood_radius; varying float v_has_floodlight; +#endif + +varying float v_height; void main() { @@ -37,9 +45,9 @@ vec4 color; #else color = v_color; #endif +float h = max(0.0, v_height); #ifdef FAUX_AO float intensity = u_ao[0]; - float h = max(0.0, v_ao.z); float h_floors = h / (u_ao[1] * u_vertical_scale); float y_shade = 1.0 - 0.9 * intensity * min(v_ao.y, 1.0); float shade = (1.0 - 0.08 * intensity) * (y_shade + (1.0 - y_shade) * (1.0 - pow(1.0 - min(h_floors / 16.0, 1.0), 16.0))) + 0.08 * intensity * min(h_floors / 160.0, 1.0); @@ -59,6 +67,13 @@ vec4 color; #endif #endif +#if defined(LIGHTING_3D_MODE) && defined(FLOOD_LIGHT) + vec3 flood_radiance = u_flood_light_color * (1.0 - min(h / v_flood_radius, 1.0)); + color.rgb += flood_radiance * v_has_floodlight; + color.rgb = linearTosRGB(color.rgb); + color *= u_opacity; +#endif + #ifdef RENDER_SHADOWS #ifdef ZERO_ROOF_RADIUS normal = mix(normal, vec3(0.0, 0.0, 1.0), z); diff --git a/src/shaders/fill_extrusion.vertex.glsl b/src/shaders/fill_extrusion.vertex.glsl index 9bcef466c22..7c7166cedf7 100644 --- a/src/shaders/fill_extrusion.vertex.glsl +++ b/src/shaders/fill_extrusion.vertex.glsl @@ -22,7 +22,6 @@ uniform vec3 u_up_dir; uniform float u_height_lift; #endif -uniform highp vec3 u_flood_light_color; uniform highp float u_vertical_scale; varying vec4 v_color; @@ -46,10 +45,15 @@ varying highp vec3 v_normal; #ifdef FAUX_AO uniform lowp vec2 u_ao; -varying vec3 v_ao; +varying vec2 v_ao; #endif +#if defined(LIGHTING_3D_MODE) && defined(FLOOD_LIGHT) +varying float v_flood_radius; varying float v_has_floodlight; +#endif + +varying float v_height; #pragma mapbox: define highp float base #pragma mapbox: define highp float height @@ -65,7 +69,6 @@ void main() { base *= u_vertical_scale; height *= u_vertical_scale; - wall_flood_light_radius *= u_vertical_scale; vec4 pos_nx = floor(a_pos_normal_ed * 0.5); // The least significant bits of a_pos_normal_ed hold: @@ -122,6 +125,7 @@ void main() { float hidden = float(centroid_pos.x == 0.0 && centroid_pos.y == 1.0); gl_Position = mix(u_matrix * vec4(pos, 1), AWAY, hidden); h = h - ele; + v_height = h; #ifdef RENDER_SHADOWS v_pos_light_view_0 = u_light_matrix_0 * vec4(pos, 1); @@ -176,7 +180,7 @@ void main() { top_height = mix(max(c_ele + height, ele + base + 2.0), ele + height, float(centroid_pos.x == 0.0)) - ele; y_ground += y_ground * 5.0 / max(3.0, top_height); #endif - v_ao = vec3(mix(concave, -concave, start), y_ground, h); + v_ao = vec2(mix(concave, -concave, start), y_ground); NdotL *= (1.0 + 0.05 * (1.0 - top_up_ny.y) * u_ao[0]); // compensate sides faux ao shading contribution #ifdef PROJECTION_GLOBE_VIEW @@ -189,13 +193,12 @@ void main() { #ifdef FLOOD_LIGHT float is_wall = 1.0 - float(t > 0.0 && top_up_ny.y > 0.0); - v_has_floodlight = float(wall_flood_light_radius > 0.0); + v_has_floodlight = float(wall_flood_light_radius > 0.0 && is_wall > 0.0); + v_flood_radius = wall_flood_light_radius * u_vertical_scale; v_color = apply_lighting_linear(color, NdotL); - vec3 flood_radiance = u_flood_light_color * (1.0 - min(max(0.0, h) / wall_flood_light_radius, 1.0)); - v_color.rgb += flood_radiance * v_has_floodlight * is_wall; - v_color.rgb = linearTosRGB(v_color.rgb); #else v_color = apply_lighting(color, NdotL); + v_color *= u_opacity; #endif #else @@ -203,9 +206,8 @@ void main() { // with lower bounds adjusted to hue of light // so that shading is tinted with the complementary (opposite) color to the light color v_color.rgb += clamp(color.rgb * NdotL * u_lightcolor, mix(vec3(0.0), vec3(0.3), 1.0 - u_lightcolor), vec3(1.0)); -#endif - v_color *= u_opacity; +#endif #ifdef ZERO_ROOF_RADIUS v_roof_color = vec4(0.0, 0.0, 0.0, 1.0); diff --git a/test/integration/render-tests/lighting-3d-mode/fill-extrusion/flood-light-fixed-radius/expected.png b/test/integration/render-tests/lighting-3d-mode/fill-extrusion/flood-light-fixed-radius/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..4a61e6ea431a84683e31d49dcd487620f132c31b GIT binary patch literal 31745 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 literal 0 HcmV?d00001 diff --git a/test/integration/render-tests/lighting-3d-mode/fill-extrusion/flood-light-fixed-radius/style.json b/test/integration/render-tests/lighting-3d-mode/fill-extrusion/flood-light-fixed-radius/style.json new file mode 100644 index 00000000000..bae223d1ed5 --- /dev/null +++ b/test/integration/render-tests/lighting-3d-mode/fill-extrusion/flood-light-fixed-radius/style.json @@ -0,0 +1,84 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 512, + "height": 512, + "allowed": 0.0006 + } + }, + "lights": [ + { + "type": "ambient", + "id": "environment", + "properties": { + "color": "rgba(200.0, 200.0, 255.0, 1.0)", + "intensity": 0.4 + } + }, + { + "type": "directional", + "id": "sun_light", + "properties": { + "color": "rgba(230.0, 230.0, 230.0, 1.0)", + "intensity": 0.9, + "direction": [ + 200.0, + 40.0 + ] + } + } + ], + "sources": { + "mapbox": { + "type": "vector", + "maxzoom": 16, + "tiles": [ + "local://tiles/{z}-{x}-{y}.mvt" + ] + } + }, + "pitch": 66.5, + "zoom": 17.5, + "bearing": 320, + "center": [ + -74.0125, + 40.7152 + ], + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "lightgray" + } + }, + { + "id": "extrusion", + "type": "fill-extrusion", + "source": "mapbox", + "source-layer": "building", + "paint": { + "fill-extrusion-color": "white", + "fill-extrusion-height": [ + "get", + "height" + ], + "fill-extrusion-opacity": 1.0, + "fill-extrusion-wall-flood-light-radius": 20, + "fill-extrusion-flood-light-color": [ + "rgb", + 255, + 255, + 0 + ], + "fill-extrusion-flood-light-intensity": 0.7, + "fill-extrusion-ambient-occlusion-radius": 1, + "fill-extrusion-ambient-occlusion-intensity": 0.4 + }, + "layout": { + "fill-extrusion-edge-radius": 0.99 + } + } + ] +} \ No newline at end of file