Skip to content

fix(rendering): prevent oversized Gaussian splats from obscuring close-up views - #7610

Open
ShineSea wants to merge 1 commit into
isl-org:mainfrom
ShineSea:3dgs-fix
Open

ShineSea wants to merge 1 commit into
isl-org:mainfrom
ShineSea:3dgs-fix

Conversation

@ShineSea

Copy link
Copy Markdown

Type

  • Bug fix (non-breaking change which fixes an issue).
  • New feature.
  • Breaking change.

Motivation and Context

With a small near clipping distance, some camera poses produce oversized, blurry Gaussian splats that obscure a large part of the scene. The attached reproduction uses near_plane = 0.1 and the publicly available racoonfamily.spz sample. The problem is view dependent; simply opening the model from its default camera position does not reliably reproduce it.

For offscreen Gaussians close to the camera plane, evaluating the perspective-projection Jacobian at their original centers can produce excessively large projected covariances and tile footprints. The existing per-splat tile cap bounds the work by dropping splats that exceed the limit, but it does not limit the covariance calculation itself. This can also remove splats whose footprints still overlap the visible image.

Description

Clamp the horizontal and vertical view-space ratios used to evaluate the Jacobian to an expanded field of view (1.3 * tan(FOV / 2)), following the original 3DGS covariance projection implementation.

Only the Jacobian evaluation position is adjusted. Screen-space centers, near/far culling, and depth sorting continue to use the original Gaussian centers. The existing per-splat tile cap and global tile-entry capacity checks remain in place.

The intended result is to reduce the oversized splats and unnecessary tile coverage caused by offscreen Jacobian evaluation. This change does not provide full near-plane clipping of the Gaussian volume or guarantee that legitimately large close-up splats will remain below the tile cap.

Reproduction

  1. Build and run the examples/cpp/GaussianSplat.cpp example on Windows.

  2. Use Niantic's racoonfamily.spz sample from SPZ v3.0.0. Direct download.

  3. Set config.near_plane = 0.1f; in the example. Use the same setting in the baseline and modified builds.

  4. Run the example with identical rendering options in both builds:

    .\GaussianSplat.exe .\racoonfamily.spz 2 0 0

    These arguments select SH degree 2, minimum input opacity 0, and density-compensation antialiasing disabled. Keep the example's test_cube visible in both runs.

  5. Match the 3D render viewport to 768 x 744 pixels, then copy the following JSON and click View > Paste. The paste action restores the camera parameters but does not resize the render viewport from the JSON's width and height fields.

    {
      "eye": [
        -0.29762446880340576,
        0.30022227764129639,
        -2.4783945083618164
      ],
      "far_plane": 3499.651611328125,
      "field_of_view": 60.0,
      "height": 744,
      "lookat": [
        1.0593240261077881,
        1.1534355878829956,
        4.2481122016906738
      ],
      "near_plane": 0.10000000149011612,
      "up": [
        -0.41435691714286804,
        0.90955936908721924,
        -0.031782753765583038
      ],
      "width": 768
    }
  6. Capture the baseline and modified results with the same model, camera, viewport, tile limits, and rendering options. Rebuild the shader resources for each run so the comparison uses the intended shader version.

Model identification:

  • Local reproduction file: E:/workspace/research/Open3D/out/build/windows-release/spz/src/ext_spz/samples/racoonfamily.spz.
  • SHA-256: 2e068d893730955c09aee324ff170c559f71c0e8758c1b14c3811a5969333cfe.

Before and After

Before

de35acc449b101d03dc2910911b096c9

After

67e9a9db93cd42424edd9869875abe6e

Validation

  • The current shader, with the Jacobian clamps enabled, compiles with glslangValidator -V --target-env vulkan1.3 -gVS from Vulkan SDK 1.4.350.0.
  • A baseline screenshot and the exact reproduction camera parameters are included.
  • Full application build and automated regression tests.

Checklist

  • I have run python util/check_style.py --apply to apply Open3D code style.
  • This PR changes Open3D behavior.
  • I will follow up and update the code if CI fails.
  • For a fork PR, I have selected Allow edits from maintainers.

@update-docs

update-docs Bot commented Oct 28, 2026

Copy link
Copy Markdown

Thanks for submitting this pull request! The maintainers of this repository would appreciate if you could update the CHANGELOG.md based on your changes.

@ShineSea ShineSea closed this Oct 28, 2026
@ShineSea ShineSea reopened this Oct 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant