Compare commits

...

6 Commits

Author SHA1 Message Date
dependabot[bot] 71f5ceb3e3
Merge e2870db626 into 41a0f18ba9 2025-11-25 14:28:46 -05:00
Don McCurdy 41a0f18ba9
Merge pull request #13018 from CesiumGS/billboard-depth-regression-fix
Fixes model-billboard depth interactions
2025-11-25 18:03:41 +00:00
Don McCurdy 8bd8ae7f63
Merge branch 'main' into billboard-depth-regression-fix 2025-11-25 13:02:57 -05:00
dependabot[bot] e2870db626
Bump actions/checkout from 5 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-21 01:08:23 +00:00
Matt Schwartz 020749de32 Add to CHANGES.md 2025-11-05 09:27:19 -05:00
Matt Schwartz f4e49d7b64 Fixes model-billboard depth interactions 2025-11-05 09:12:11 -05:00
8 changed files with 40 additions and 21 deletions

View File

@ -10,7 +10,7 @@ jobs:
issues: write
pull-requests: write
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: install node 22
uses: actions/setup-node@v6
with:

View File

@ -24,7 +24,7 @@ jobs:
GITHUB_SHA: ${{ github.sha }}
DEPLOYED_URL: https://ci-builds.cesium.com/cesium/${{ github.ref_name }}/
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: install node 22
uses: actions/setup-node@v6
with:

View File

@ -11,7 +11,7 @@ jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: install node 22
uses: actions/setup-node@v6
with:
@ -32,7 +32,7 @@ jobs:
AWS_REGION: us-east-1
BRANCH: ${{ github.ref_name }}
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: install node 22
uses: actions/setup-node@v6
with:
@ -49,7 +49,7 @@ jobs:
release-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: install node 22
uses: actions/setup-node@v6
with:
@ -65,7 +65,7 @@ jobs:
node-20:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: install node 20
uses: actions/setup-node@v6
with:

View File

@ -7,7 +7,7 @@ jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: install node 22
uses: actions/setup-node@v6
with:
@ -32,7 +32,7 @@ jobs:
GITHUB_REPO: ${{ github.repository }}
GITHUB_SHA: ${{ github.sha }}
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: install node 22
uses: actions/setup-node@v6
with:

View File

@ -16,7 +16,7 @@ jobs:
GITHUB_REPO: ${{ github.repository }}
GITHUB_SHA: ${{ github.sha }}
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: install node 22
uses: actions/setup-node@v6
with:

View File

@ -1,11 +1,12 @@
# Change Log
## 1.136
## 1.136 - 2025-12-01
### @cesium/engine
#### Fixes :wrench:
- Fixed depth testing bug with billboards and labels clipping through models [#13012](https://github.com/CesiumGS/cesium/issues/13012)
- Billboards using `imageSubRegion` now render as expected. [#12585](https://github.com/CesiumGS/cesium/issues/12585)
- Improved scaling of SVGs in billboards [#13020](https://github.com/CesiumGS/cesium/issues/13020)
- Fixed unexpected outline artifacts around billboards [#13038](https://github.com/CesiumGS/cesium/issues/13038)

View File

@ -34,6 +34,7 @@ import SDFSettings from "./SDFSettings.js";
import TextureAtlas from "../Renderer/TextureAtlas.js";
import VerticalOrigin from "./VerticalOrigin.js";
import Ellipsoid from "../Core/Ellipsoid.js";
import WebGLConstants from "../Core/WebGLConstants.js";
const SHOW_INDEX = Billboard.SHOW_INDEX;
const POSITION_INDEX = Billboard.POSITION_INDEX;
@ -2039,7 +2040,8 @@ BillboardCollection.prototype.update = function (frameState) {
) {
this._rsOpaque = RenderState.fromCache({
depthTest: {
enabled: false,
enabled: true,
func: WebGLConstants.LESS,
},
depthMask: true,
});
@ -2059,7 +2061,10 @@ BillboardCollection.prototype.update = function (frameState) {
) {
this._rsTranslucent = RenderState.fromCache({
depthTest: {
enabled: false,
enabled: true,
func: useTranslucentDepthMask
? WebGLConstants.LEQUAL
: WebGLConstants.LESS,
},
depthMask: useTranslucentDepthMask,
blending: BlendingState.ALPHA_BLEND,

View File

@ -131,7 +131,9 @@ void doThreePointDepthTest(float eyeDepth, bool applyTranslate) {
}
#endif
void doDepthTest() {
// Extra manual depth testing is done to allow more control over how a billboard is occluded
// by the globe when near and far from the camera.
void doDepthTest(float globeDepth) {
float temp = v_compressed.y;
temp = temp * SHIFT_RIGHT1;
float temp2 = (temp - floor(temp)) * SHIFT_LEFT1;
@ -156,14 +158,10 @@ void doDepthTest() {
}
#endif
// Automatic depth testing of billboards is disabled (@see BillboardCollection#update).
// Instead, we do one of two types of manual depth tests (potentially in addition to the test above), depending on the camera's distance to the billboard fragment.
// If we're far away, we just compare against a flat, camera-facing depth-plane at the ellipsoid's center.
// If we're close, we compare against the globe depth texture (which includes depth from the 3D tile pass).
vec2 fragSt = gl_FragCoord.xy / czm_viewport.zw;
float globeDepth = getGlobeDepthAtCoords(fragSt);
if (globeDepth == 0.0) return; // Not on globe
if (globeDepth == 0.0) return; // Not on globe
float distanceToEllipsoidCenter = -length(czm_viewerPositionWC); // depth is negative by convention
float testDistance = (eyeDepth > -u_coarseDepthTestDistance) ? globeDepth : distanceToEllipsoidCenter;
if (eyeDepth < testDistance) {
@ -175,7 +173,10 @@ void main()
{
if (v_splitDirection < 0.0 && gl_FragCoord.x > czm_splitPosition) discard;
if (v_splitDirection > 0.0 && gl_FragCoord.x < czm_splitPosition) discard;
doDepthTest();
vec2 fragSt = gl_FragCoord.xy / czm_viewport.zw;
float globeDepth = getGlobeDepthAtCoords(fragSt);
doDepthTest(globeDepth);
vec4 color = texture(u_atlas, v_textureCoordinates);
@ -243,6 +244,18 @@ void main()
out_FragColor = color;
#ifdef LOG_DEPTH
czm_writeLogDepth();
// If we've made it here, we passed our manual depth test, above. But the automatic depth test will
// still run, and some fragments of the billboard may clip against the globe. To prevent that,
// ensure the depth value we write out is in front of the globe depth.
float depthArg = v_depthFromNearPlusOne;
if (globeDepth != 0.0) { // On the globe
float globeDepthFromNearPlusOne = (-globeDepth - czm_currentFrustum.x) + 1.0;
float nudge = max(globeDepthFromNearPlusOne * 5e-6, czm_epsilon7);
float globeOnTop = max(1.0, globeDepthFromNearPlusOne - nudge);
depthArg = min(depthArg, globeOnTop);
}
czm_writeLogDepth(depthArg);
#endif
}