mirror of https://github.com/CesiumGS/cesium.git
Compare commits
1 Commits
71f5ceb3e3
...
37313e66a7
| Author | SHA1 | Date |
|---|---|---|
|
|
37313e66a7 |
|
|
@ -1,12 +1,11 @@
|
|||
# Change Log
|
||||
|
||||
## 1.136 - 2025-12-01
|
||||
## 1.136
|
||||
|
||||
### @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)
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@ 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;
|
||||
|
|
@ -2040,8 +2039,7 @@ BillboardCollection.prototype.update = function (frameState) {
|
|||
) {
|
||||
this._rsOpaque = RenderState.fromCache({
|
||||
depthTest: {
|
||||
enabled: true,
|
||||
func: WebGLConstants.LESS,
|
||||
enabled: false,
|
||||
},
|
||||
depthMask: true,
|
||||
});
|
||||
|
|
@ -2061,10 +2059,7 @@ BillboardCollection.prototype.update = function (frameState) {
|
|||
) {
|
||||
this._rsTranslucent = RenderState.fromCache({
|
||||
depthTest: {
|
||||
enabled: true,
|
||||
func: useTranslucentDepthMask
|
||||
? WebGLConstants.LEQUAL
|
||||
: WebGLConstants.LESS,
|
||||
enabled: false,
|
||||
},
|
||||
depthMask: useTranslucentDepthMask,
|
||||
blending: BlendingState.ALPHA_BLEND,
|
||||
|
|
|
|||
|
|
@ -131,9 +131,7 @@ void doThreePointDepthTest(float eyeDepth, bool applyTranslate) {
|
|||
}
|
||||
#endif
|
||||
|
||||
// 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) {
|
||||
void doDepthTest() {
|
||||
float temp = v_compressed.y;
|
||||
temp = temp * SHIFT_RIGHT1;
|
||||
float temp2 = (temp - floor(temp)) * SHIFT_LEFT1;
|
||||
|
|
@ -158,10 +156,14 @@ void doDepthTest(float globeDepth) {
|
|||
}
|
||||
#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).
|
||||
|
||||
if (globeDepth == 0.0) return; // Not on globe
|
||||
vec2 fragSt = gl_FragCoord.xy / czm_viewport.zw;
|
||||
float globeDepth = getGlobeDepthAtCoords(fragSt);
|
||||
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) {
|
||||
|
|
@ -173,10 +175,7 @@ void main()
|
|||
{
|
||||
if (v_splitDirection < 0.0 && gl_FragCoord.x > czm_splitPosition) discard;
|
||||
if (v_splitDirection > 0.0 && gl_FragCoord.x < czm_splitPosition) discard;
|
||||
|
||||
vec2 fragSt = gl_FragCoord.xy / czm_viewport.zw;
|
||||
float globeDepth = getGlobeDepthAtCoords(fragSt);
|
||||
doDepthTest(globeDepth);
|
||||
doDepthTest();
|
||||
|
||||
vec4 color = texture(u_atlas, v_textureCoordinates);
|
||||
|
||||
|
|
@ -244,18 +243,6 @@ void main()
|
|||
out_FragColor = color;
|
||||
|
||||
#ifdef LOG_DEPTH
|
||||
// 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);
|
||||
czm_writeLogDepth();
|
||||
#endif
|
||||
}
|
||||
Loading…
Reference in New Issue