From 9f9249b39b87017735646e661e974e842afaca5e Mon Sep 17 00:00:00 2001 From: Jordi Torres Date: Fri, 31 Jan 2025 10:15:20 +0100 Subject: [PATCH] Fix problems with models and depth precision in ortho camera (internal-2152) This PR fixes two problems with ortho projection, one when models are close to the camera and the precision was being lost, and the other when using transparent models being culled, (mostly visible with terrain enabled). --- 3d-style/render/draw_model.ts | 9 +- src/geo/projection/far_z.ts | 4 +- .../expected.png | Bin 0 -> 30094 bytes .../style.json | 233 ++++++++++++++++++ .../expected.png | Bin 0 -> 21277 bytes .../style.json | 223 +++++++++++++++++ 6 files changed, 463 insertions(+), 6 deletions(-) create mode 100644 test/integration/render-tests/model-layer/camera-projection/camera-orthographic-model-depth-terrain/expected.png create mode 100644 test/integration/render-tests/model-layer/camera-projection/camera-orthographic-model-depth-terrain/style.json create mode 100644 test/integration/render-tests/model-layer/camera-projection/camera-orthographic-model-depth/expected.png create mode 100644 test/integration/render-tests/model-layer/camera-projection/camera-orthographic-model-depth/style.json diff --git a/3d-style/render/draw_model.ts b/3d-style/render/draw_model.ts index bcf935f8746..9342a3b3b85 100644 --- a/3d-style/render/draw_model.ts +++ b/3d-style/render/draw_model.ts @@ -289,11 +289,10 @@ function prepareMeshes(transform: Transform, node: ModelNode, modelMatrix: mat4, } const centroidPos = vec3.transformMat4([] as any, mesh.centroid, worldViewProjection); - // Filter meshes behind the camera - if (centroidPos[2] > 0.0) { - const transparentMesh: SortedMesh = {mesh, depth: centroidPos[2], modelIndex, worldViewProjection, nodeModelMatrix}; - transparentMeshes.push(transparentMesh); - } + // Filter meshes behind the camera if in perspective mode + if (!transform.isOrthographic && centroidPos[2] <= 0.0) continue; + const transparentMesh: SortedMesh = {mesh, depth: centroidPos[2], modelIndex, worldViewProjection, nodeModelMatrix}; + transparentMeshes.push(transparentMesh); } } if (node.children) { diff --git a/src/geo/projection/far_z.ts b/src/geo/projection/far_z.ts index a96c54e9459..5d91a64527a 100644 --- a/src/geo/projection/far_z.ts +++ b/src/geo/projection/far_z.ts @@ -26,7 +26,9 @@ export function farthestPixelDistanceOnPlane(tr: Transform, pixelsPerMeter: numb // Due to precision of sources with low maxZoom, content is prone to flickering on zoom above 18. // Use larger furthest distance also on pitch before the horizon, especially on higher zoom to limit // the performance and depth range resolution impact. - if (!tr.elevation || tr.elevation.exaggeration() === 0) { + // In case of orthographic projection we don't want to extend the far clip plane as the + // depth is linear and we would be effectively decreasing precision. + if (!tr.isOrthographic && (!tr.elevation || tr.elevation.exaggeration() === 0)) { furthestDistance *= (1.0 + Math.max(tr.zoom - 17, 0)); } return Math.min(furthestDistance * 1.01, horizonDistance); diff --git a/test/integration/render-tests/model-layer/camera-projection/camera-orthographic-model-depth-terrain/expected.png b/test/integration/render-tests/model-layer/camera-projection/camera-orthographic-model-depth-terrain/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..4171f65ab107f7be9e052d10a907699357116c9c GIT binary patch literal 30094 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 Dit!hE literal 0 HcmV?d00001 diff --git a/test/integration/render-tests/model-layer/camera-projection/camera-orthographic-model-depth/style.json b/test/integration/render-tests/model-layer/camera-projection/camera-orthographic-model-depth/style.json new file mode 100644 index 00000000000..e28074714d2 --- /dev/null +++ b/test/integration/render-tests/model-layer/camera-projection/camera-orthographic-model-depth/style.json @@ -0,0 +1,223 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 512, + "height": 512, + "allowed": 0.0008 + } + }, + "lights": [ + { + "type": "ambient", + "id": "environment", + "properties": { + "color": "rgba(255.0, 255.0, 255.0, 1.0)", + "intensity": 0.5 + } + }, + { + "type": "directional", + "id": "sun_light", + "properties": { + "color": "rgba(255.0, 255.0, 255.0, 1.0)", + "intensity": 0.5, + "cast-shadows": false + } + } + ], + "sources": { + "mapbox-dem": { + "type": "raster-dem", + "maxzoom": 14, + "tileSize": 512, + "tiles": ["local://models/dem/14-8847-5550.terrain-512.png"] + }, + "mapbox": { + "type": "vector", + "maxzoom": 16, + "tiles": [ + "local://tiles/{z}-{x}-{y}.mvt" + ] + }, + "model": { + "type": "model", + "models": { + "model-1" : { + "uri": "local://models/cubes-depth.gltf", + "position": [14.3946, 50.0834], + "orientation": [17, 0, 0] + } + } + } + }, + "pitch": 0, + "zoom": 19.0, + "bearing": 0, + "center": [ + 14.3946, + 50.0834 + ], + "camera": { + "camera-projection": "orthographic" + }, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "lightgray" + } + }, + { + "id": "land", + "type": "fill", + "source": "mapbox", + "source-layer": "water", + "paint": { + "fill-color": "lightblue" + } + }, + { + "id": "road", + "type": "line", + "source": "mapbox", + "source-layer": "road", + "paint": { + "line-color": "lightyellow", + "line-width": 10 + } + }, + { + "id": "extrusion", + "type": "fill-extrusion", + "source": "mapbox", + "source-layer": "building", + "paint": { + "fill-extrusion-color": "white", + "fill-extrusion-height": ["get", "height"] + } + }, + { + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "primary", + "secondary", + "street", + "street_limited", + "tertiary", + "trunk" + ], + true, + false + ], + "id": "road-label-simple", + "layout": { + "symbol-placement": "line", + "text-field": [ + "format", + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + {} + ], + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ], + "text-letter-spacing": 0.009999999776482582, + "text-max-angle": 30.0, + "text-padding": 1.0, + "text-pitch-alignment": "viewport", + "text-rotation-alignment": "map", + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10.0, + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "primary", + "secondary", + "tertiary", + "trunk" + ], + 10.0, + 9.0 + ], + 18.0, + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "primary", + "secondary", + "tertiary", + "trunk" + ], + 16.0, + 14.0 + ] + ] + }, + "minzoom": 12.0, + "paint": { + "text-color": [ + "rgba", + 154.0, + 121.00000762939453, + 55.000003814697269, + 1.0 + ], + "text-halo-color": [ + "rgba", + 255.0, + 255.0, + 255.0, + 1.0 + ], + "text-halo-width": 1.0 + }, + "source": "mapbox", + "source-layer": "road", + "type": "symbol" + }, + { + "id": "model", + "type": "model", + "source": "model", + "paint" : { + "model-scale" : [4, 4, 4] + } + } + ] +}