From 114bf7cd668beff9a692b0e94ba590ce66e43e37 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 26 Oct 2017 17:52:59 -0400 Subject: [PATCH 1/3] Fix flickering with polygon offset --- Source/Scene/Batched3DModel3DTileContent.js | 3 ++- Source/Scene/Cesium3DTileBatchTable.js | 18 ++++++++++++++++-- Source/Scene/Instanced3DModel3DTileContent.js | 2 +- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Source/Scene/Batched3DModel3DTileContent.js b/Source/Scene/Batched3DModel3DTileContent.js index 7db1c61386cb..b83dbfcec00e 100644 --- a/Source/Scene/Batched3DModel3DTileContent.js +++ b/Source/Scene/Batched3DModel3DTileContent.js @@ -452,7 +452,8 @@ define([ // If any commands were pushed, add derived commands var commandEnd = frameState.commandList.length; if ((commandStart < commandEnd) && frameState.passes.render) { - this._batchTable.addDerivedCommands(frameState, commandStart); + var finalResolution = this._tile._finalResolution; + this._batchTable.addDerivedCommands(frameState, commandStart, finalResolution); } }; diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index 531ce6b2b9b2..6a6a4f3044e9 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -1209,7 +1209,7 @@ define([ OPAQUE_AND_TRANSLUCENT : 2 }; - Cesium3DTileBatchTable.prototype.addDerivedCommands = function(frameState, commandStart) { + Cesium3DTileBatchTable.prototype.addDerivedCommands = function(frameState, commandStart, finalResolution) { var commandList = frameState.commandList; var commandEnd = commandList.length; var tile = this._content._tile; @@ -1236,7 +1236,7 @@ define([ } if (bivariateVisibilityTest) { - if (command.pass !== Pass.TRANSLUCENT) { + if (command.pass !== Pass.TRANSLUCENT && !finalResolution) { if (!defined(derivedCommands.zback)) { derivedCommands.zback = deriveZBackfaceCommand(derivedCommands.originalCommand); } @@ -1329,6 +1329,20 @@ define([ var rs = clone(derivedCommand.renderState, true); rs.cull.enabled = true; rs.cull.face = CullFace.FRONT; + // Back faces do not need to write color. + rs.colorMask = { + red : false, + green : false, + blue : false, + alpha : false + }; + // Push back face depth away from the camera so it is less likely that back faces and front faces of the same tile + // intersect and overlap. This helps avoid flickering for very thin double-sided walls. + rs.polygonOffset = { + enabled : true, + factor : 5.0, + units : 5.0 + }; derivedCommand.renderState = RenderState.fromCache(rs); derivedCommand.castShadows = false; derivedCommand.receiveShadows = false; diff --git a/Source/Scene/Instanced3DModel3DTileContent.js b/Source/Scene/Instanced3DModel3DTileContent.js index 2bd40a0ae6db..aca06ae3beef 100644 --- a/Source/Scene/Instanced3DModel3DTileContent.js +++ b/Source/Scene/Instanced3DModel3DTileContent.js @@ -517,7 +517,7 @@ define([ // If any commands were pushed, add derived commands var commandEnd = frameState.commandList.length; if ((commandStart < commandEnd) && frameState.passes.render) { - this._batchTable.addDerivedCommands(frameState, commandStart); + this._batchTable.addDerivedCommands(frameState, commandStart, false); } }; From 734d0f3b174f63741476e4889eb860a07b51ba2e Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 26 Oct 2017 19:01:41 -0400 Subject: [PATCH 2/3] Fix test --- Specs/Scene/Cesium3DTilesetSpec.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Specs/Scene/Cesium3DTilesetSpec.js b/Specs/Scene/Cesium3DTilesetSpec.js index c6f802b8f315..ceffec8c895f 100644 --- a/Specs/Scene/Cesium3DTilesetSpec.js +++ b/Specs/Scene/Cesium3DTilesetSpec.js @@ -2492,8 +2492,9 @@ defineSuite([ scene.renderForSpecs(); - // 2 for root tile, 2 for child, 1 for stencil clear - expect(statistics.numberOfCommands).toEqual(5); + // 2 for root tile, 1 for child, 1 for stencil clear + // Tiles that are marked as finalResolution, including leaves, do not create back face commands + expect(statistics.numberOfCommands).toEqual(4); expect(root.selected).toBe(true); expect(root._finalResolution).toBe(false); expect(root.children[0].children[0].children[3].selected).toBe(true); @@ -2504,6 +2505,7 @@ defineSuite([ var rs = commandList[1].renderState; expect(rs.cull.enabled).toBe(true); expect(rs.cull.face).toBe(CullFace.FRONT); + expect(rs.polygonOffset.enabled).toBe(true); }); }); From 2888c3fb5ce16a288ccba84cb7872d0aaaa2ac1e Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 26 Oct 2017 19:03:36 -0400 Subject: [PATCH 3/3] Updated CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 53ce75ad40ef..26790301e014 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -15,6 +15,7 @@ Change Log * Added `customTags` property to the UrlTemplateImageryProvider to allow custom keywords in the template URL. [#5696](https://github.com/AnalyticalGraphicsInc/cesium/pull/5696) * Improved CZML Reference Properties example [#5754](https://github.com/AnalyticalGraphicsInc/cesium/pull/5754) * Fixed bug with placemarks in imported KML: placemarks with no specified icon would be displayed with default icon. [#5819](https://github.com/AnalyticalGraphicsInc/cesium/issues/5819) +* Fixed flickering artifacts on tilesets with thin walls. [#5940](https://github.com/AnalyticalGraphicsInc/cesium/pull/5940) ### 1.38 - 2017-10-02