diff --git a/CHANGES.md b/CHANGES.md index 6553014c59d6..2f1748de543b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -12,6 +12,7 @@ ##### Fixes :wrench: - Fix label rendering bug in WebGL1 contexts. [#12301](https://github.com/CesiumGS/cesium/pull/12301) +- Fix point cloud filtering performance on certain hardware [#12317](https://github.com/CesiumGS/cesium/pull/12317) #### @cesium/widgets diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 4ef81dd82c21..46b59573acfd 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -417,3 +417,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu - [Michael Nusair](https://github.com/mnpcmw6444) - [Kirn Kim](https://github.com/squrki) - [Emanuele Mastaglia](https://github.com/Masty88) +- [Connor Manning](https://github.com/connormanning) diff --git a/packages/engine/Source/Scene/Model/PointCloudStylingPipelineStage.js b/packages/engine/Source/Scene/Model/PointCloudStylingPipelineStage.js index 967e07fcfe98..c89786f88f05 100644 --- a/packages/engine/Source/Scene/Model/PointCloudStylingPipelineStage.js +++ b/packages/engine/Source/Scene/Model/PointCloudStylingPipelineStage.js @@ -333,9 +333,10 @@ function addShaderFunctionsAndDefines(shaderBuilder, shaderFunctionInfo) { shaderBuilder.addDefine( "HAS_POINT_CLOUD_SHOW_STYLE", undefined, - ShaderDestination.VERTEX, + ShaderDestination.BOTH, ); shaderBuilder.addVertexLines(showStyleFunction); + shaderBuilder.addVarying("float", "v_pointCloudShow"); } const pointSizeStyleFunction = shaderFunctionInfo.pointSizeStyleFunction; diff --git a/packages/engine/Source/Shaders/Model/ModelFS.glsl b/packages/engine/Source/Shaders/Model/ModelFS.glsl index 0500c0b9f1ff..a6cb2827f60f 100644 --- a/packages/engine/Source/Shaders/Model/ModelFS.glsl +++ b/packages/engine/Source/Shaders/Model/ModelFS.glsl @@ -28,6 +28,13 @@ SelectedFeature selectedFeature; void main() { + #ifdef HAS_POINT_CLOUD_SHOW_STYLE + if (v_pointCloudShow == 0.0) + { + discard; + } + #endif + #ifdef HAS_MODEL_SPLITTER modelSplitterStage(); #endif diff --git a/packages/engine/Source/Shaders/Model/ModelVS.glsl b/packages/engine/Source/Shaders/Model/ModelVS.glsl index b95b329f59ff..2164da1024bc 100644 --- a/packages/engine/Source/Shaders/Model/ModelVS.glsl +++ b/packages/engine/Source/Shaders/Model/ModelVS.glsl @@ -145,5 +145,13 @@ void main() gl_PointSize *= show; #endif - gl_Position = show * positionClip; + // Important NOT to compute gl_Position = show * positionClip or we hit: + // https://github.com/CesiumGS/cesium/issues/11270 + // + // We will discard points with v_pointCloudShow == 0 in the fragment shader. + gl_Position = positionClip; + + #ifdef HAS_POINT_CLOUD_SHOW_STYLE + v_pointCloudShow = show; + #endif } diff --git a/packages/engine/Specs/Scene/Model/PointCloudStylingPipelineStageSpec.js b/packages/engine/Specs/Scene/Model/PointCloudStylingPipelineStageSpec.js index 11cf22014bd7..ae7deeead20b 100644 --- a/packages/engine/Specs/Scene/Model/PointCloudStylingPipelineStageSpec.js +++ b/packages/engine/Specs/Scene/Model/PointCloudStylingPipelineStageSpec.js @@ -314,7 +314,9 @@ describe( "HAS_POINT_CLOUD_SHOW_STYLE", "COMPUTE_POSITION_WC_STYLE", ]); - ShaderBuilderTester.expectHasFragmentDefines(shaderBuilder, []); + ShaderBuilderTester.expectHasFragmentDefines(shaderBuilder, [ + "HAS_POINT_CLOUD_SHOW_STYLE", + ]); ShaderBuilderTester.expectHasVertexUniforms(shaderBuilder, [ "uniform vec4 model_pointCloudParameters;",