NVGS: Neural Visibility for Occlusion Culling in 3D Gaussian Splatting [CVPR 2026]

April 2, 2026 · View on GitHub

PyTorch  CUDA 
arXiv 

This repository contains the official authors implementation of the rendering code associated with the paper:

NVGS: Neural Visibility for Occlusion Culling in 3D Gaussian Splatting
Brent Zoomers, Florian Hahlbohm, Joni Vanherck, Lode Jorissen,Marcus Magnor, Nick Michiels
CVPR, 2026
Project page | Paper 

Requirements

  • An NVIDIA GPU
  • Linux or Windows (Tested on Linux Debian 12, Ubuntu 22.04, Windows 11 with VS2022; Our limited experiments on Windows show slower rendering times than on Linux (possibly due to WDDM as there seem to be reports on this degrading performance). )
  • A recent CUDA SDK (CUDA Toolkit 12.8 recommended, tested both on Linux and Windows) and a compatible C++ compiler
  • Anaconda / Miniconda installed

Setup

As a preparatory step, the NeRFICG framework needs to be set up. Please follow the instructions in its README to set up a compatible Conda environment.

Now add NVGS as an additional method by cloning this repository into src/Methods/NVGSViewer:

# HTTPS
git clone https://github.com/UHasselt-DigitalFutureLab/NVGSViewer.git src/Methods/NVGSViewer --recursive

or

# SSH
git clone git@github.com:UHasselt-DigitalFutureLab/NVGSViewer.git src/Methods/NVGSViewer --recursive

Next, install all method-specific dependencies and CUDA extensions using:

python ./scripts/install.py -m NVGSViewer

Note: The framework determines on-the-fly what extra modules need to be installed. Sometimes this causes unnecessary errors/warnings that can interrupt the installation process. In this case, first try to rerun the command before investigating the error in detail.

In case anything goes wrong during installation, or you want to test changes to the backend, you can rebuild it using:

python ./scripts/install.py -e src/Methods/NVGSViewer/NVGSCudaBackend

We provide the next script to setup the nerficg environment as we used it. This script copies generate_tables.py into the scripts folder. It then creates the dataset/nvgs folder and copies _layouts and _3dgs-assets into this folder. These paths can be changed in the config file later if needed.

python ./src/Methods/NVGSViewer/setup_nerficg.py

Rendering

We use config files to set rendering parameters, including layout files, whether to use anti-aliasing, ... .

To create a config file run:

python ./scripts/create_config.py -m NVGSViewer -d Empty -o <config_name>

Then run to render a layout file:

python ./scripts/train.py -c configs/<config_name>.yaml

Evaluation

We provide an updated generate_tables.py that replaces the default NeRFICG script. It:

  1. Caps PSNR, since identical images produce inf and skew the average (value of ~116.07 calculated as if one pixel changes one intensity value for a 1920x1080x3 image.)
  2. Adds FLIP as an additional metric
  3. Changed default metrics/paths for easier use for NVGS

Then run:

python src/scripts/generate_tables.py -c -d <output_folder> # Generates the config
python src/scripts/generate_tables.py -d <output_folder> # Computes metrics

Using your own assets/layouts

We use the following directory structure as a default setup:

All assets should be placed under dataset/nvgs/_3dgs-assets/asset_kind/asset_name/ply_suffix

You can change these paths as needed in the config file for anything dataset specific, and in the layout file for anything asset specific.

ParameterDescriptionExample
asset_kindThe parent category or dataset namegarden, mipnerf360
asset_nameThe specific object or scene folderbench, stump
ply_suffixThe filename of the point cloud (excluding extension)iteration_30000, point_cloud

Note: ply_suffix refers to the preprocessed ply file, if you pass the original PLY the MLP won't match.

Instance Attributes

For every instance of an asset placed in the scene, the following spatial properties are required:

  • positions
    The (x,y,z)(x, y, z) coordinates defining the asset's origin in world space.

  • quaternions
    The rotation of the asset expressed as a 4-element vector (w,x,y,z)(w, x, y, z).

  • scale
    A 3-element vector (sx,sy,sz)(s_x, s_y, s_z) defining the scaling of the asset.

We use standard COLMAP conventions throughout our code; however, the layout files provided by V3DG use different coordinate systems (Blender for world, OpenGL for cam), hence we have a conversion flag LOAD_V3DGS_LAYOUT to indicate this.

You can use the layouts provided in this viewer as an example to create your own layouts.

BibTeX

@misc{zoomers2025nvgsneuralvisibilityocclusion,
  title={NVGS: Neural Visibility for Occlusion Culling in 3D Gaussian Splatting},
  author={Brent Zoomers and Florian Hahlbohm and Joni Vanherck and Lode Jorissen and Marcus Magnor and Nick Michiels},
  year={2025},
  eprint={2511.19202},
  archivePrefix={arXiv},
  primaryClass={cs.CV},
  url={https://arxiv.org/abs/2511.19202}
}

Funding and Acknowledgments

This research was partly funded by the FWO fellowship grants (1SHDZ24N, 1S80926N), the Special Research Fund (BOF) of Hasselt University (R-14360, R-14436), the NORM.AI SBO project, the DFG project "Real-Action VR" (ID 523421583), and the Flanders Make's XRTWin SBO project (R-12528). This work was made possible with the support of MAXVR-INFRA, a scalable and flexible infrastructure that facilitates the transition to digital-physical work environments.

We thank the authors of V3DG for providing the scripts and datasets used in their work.