Post

AI

NeRF vs Gaussian Splatting Requires More Than an FPS Test

A source audit of radiance, compositing, licenses, and Unity rendering shows why choosing Gaussian Splatting does not make a captured scene a game asset.

Original diagram separating captured-scene representation, runtime rendering, and asset-rights decisions
Original diagram separating captured-scene representation, runtime rendering, and asset-rights decisions

Does choosing Gaussian Splatting make a captured scene ready for a game?

The short comparison in this May 2024 note gave NeRF the quality column and Gaussian Splatting the production column. Re-reading the primary papers and the implementation changes that decision. Both methods represent view-dependent appearance. Both accumulate contributions along a viewing path. Neither the name of the representation nor an attractive frame rate establishes that a reconstructed scene can participate in a game’s lighting, transparency, or collision systems.

The sharper distinction is between the cost of querying a learned field and the cost of projecting, ordering, and blending explicit primitives. A separate distinction concerns what a particular renderer implements. A third concerns the rights attached to the training code and the captured material. These questions meet at deployment, but they require different evidence.

This Source Audit inspects the original NeRF and 3D Gaussian Splatting papers, commit-pinned source and licenses, the later gsplat implementation, and a community Unity renderer. The only executed experiment is a small CPU arithmetic check of compositing weights. No reconstruction was trained, no GPU rendering benchmark was run, and no Unity scene was tested for this rebuild. Engine findings below describe the inspected renderer, rather than every possible Gaussian Splatting integration.

Three separate deployment decisions for a captured scene Original diagram derived from the inspected sources; the three gates are this article’s decision framework, not a measured benchmark.

Both representations carry view-dependent radiance

In the original NeRF paper, a neural network receives a spatial position and a viewing direction. It predicts volume density and emitted color. Density depends on position; the color branch also receives direction. A camera image is obtained by sampling along rays and integrating those predictions. Calling the network’s output simply “RGBA per point” loses an important dependency: opacity is derived from density and the distance represented by a sample.

The original 3D Gaussian Splatting method instead optimizes an explicit collection of anisotropic Gaussians. Each has a position, covariance-related parameters, opacity, and appearance coefficients. Its real-scene workflow initializes the representation from sparse points and camera information recovered through structure from motion. This is not a universal requirement: the pinned synthetic Blender loader can initialize random points. Training changes the collection through optimization and density control; it is not just the original sparse point cloud displayed more quickly. Both original papers address static-scene novel-view synthesis.

Nor is its color necessarily constant. At the audited official commit 54c035f, gaussian_renderer/__init__.py evaluates spherical harmonics using a normalized direction between the camera and Gaussian positions when the Python evaluation path is selected. That is a concrete source-level reason to reject “NeRF has view dependence, splats do not” as a decision rule. The appearance representation differs, while both originals account for changing viewing direction.

The phrase “Gaussian Splatting has no neural network” is useful only when scoped to the original method’s directly optimized Gaussian parameters. It does not forbid another system from predicting Gaussian attributes or adding a learned appearance component. The safe comparison is between these inspected implementations, rather than a claim about every method that later adopted either label.

DecisionOriginal NeRFOriginal 3D Gaussian SplattingWhat to establish before choosing
Stored representationNetwork parameters describing a radiance fieldExplicit Gaussian parameters and appearance coefficientsWhich representation and export format the target runtime accepts
Image formationRay sampling and density-based accumulationProjection, ordering, and alpha blending of Gaussian contributionsThe actual renderer and its camera/visibility assumptions
View-dependent appearanceDirection-conditioned color predictionSpherical-harmonic appearanceBehavior along the camera paths the application will use
Scene preparationImages with known camera informationCamera information and sparse reconstruction in the original workflowWhether capture and calibration are sufficiently reliable
Engine integrationRequires a suitable field renderer or another derived representationRequires a splat renderer with explicit integration behaviorDepth, transparency, lighting, and interaction requirements

This table is an analytical comparison of the original designs. It is not a ranking of visual quality, training time, or commercial readiness. A quality ranking needs a specified dataset, camera split, implementation, and metric; an engine decision also needs requirements that those metrics may never measure.

Density and opacity meet in the compositing weights

The original 3DGS paper explicitly relates its image formation to volume rendering while distinguishing the rendering algorithms. That connection makes the familiar “continuous versus discrete” comparison less decisive than it first appears. The representation changes how contributions are obtained; it does not remove the need to account for visibility and transmittance.

For a NeRF sample with density sigma over a ray interval delta, its alpha contribution is 1 - exp(-sigma * delta). Each sample’s color is then weighted by that alpha and by the transmittance left after the samples before it. Gaussian rasterization likewise blends contributions using alpha and the preceding transmittance, although projection, Gaussian footprint, opacity, and ordering determine its contributions differently.

An arithmetic example exposes why “RGBA at a point” is too loose. Set sigma to ln(2) and delta to 1. The resulting alpha is 0.5. With a red contribution followed by a blue contribution, each with that alpha, the weights are 0.5 and 0.25, leaving 0.25 transmittance for the background. Reversing their order would change which color receives the larger weight.

1
2
3
4
5
6
7
8
9
10
11
import math

alpha = 1 - math.exp(-math.log(2) * 1.0)
transmittance = 1.0
rgb = [0.0, 0.0, 0.0]
for color in [(1.0, 0.0, 0.0), (0.0, 0.0, 1.0)]:
    weight = transmittance * alpha
    rgb = [out + weight * channel for out, channel in zip(rgb, color)]
    transmittance *= 1 - alpha
print(rgb, transmittance)
# [0.5, 0.0, 0.25] 0.25

The displayed snippet was executed with python3 - (code supplied on standard input) on 2026-10-14 and printed [0.5, 0.0, 0.25] 0.25. A separate run also checked assertions for alpha, weights, RGB, and residual transmittance. This verifies the numerical illustration only. It neither reproduces a NeRF renderer nor models the projected footprint and ordering of a real splat scene. Its practical lesson is narrower: densities, alphas, and final pixel contributions are different quantities, and contribution order matters.

What changed since the May 2024 comparison?

The ecosystem now offers additional implementation choices beyond the two original repositories. At gsplat commit 512d366, the rendering implementation documents features including antialias compensation associated with Mip-Splatting and camera distortion and rolling-shutter support referencing 3DGUT. Its top-level license and rendering source identify Apache-2.0 licensing. These are findings about that pinned library, rather than proof that a Unity importer or another training frontend exposes the same capabilities.

That distinction changes a production evaluation. A feature in a CUDA backend, a setting available through a trainer, an attribute preserved in an exported file, and a feature implemented by an engine renderer are separate links in a pipeline. Evidence for one link cannot stand in for the others. For example, documentation of camera handling in a backend does not establish that an existing engine asset will render with equivalent camera behavior.

The audited community Unity project at 2c6fed3 makes another part of the problem visible. Its render-pipeline integration document says the renderer tests splats against the opaque scene’s depth buffer but does not write splat depth. It describes poor interaction with ordinary transparency, no interaction with Unity lights, shadows, probes, or lightmaps, and only approximate ordering between separate overlapping splat objects.

These are documented limitations of that implementation. They should not be generalized into a theorem that splats can never support other rendering features. They do, however, defeat the old note’s broad recommendation of Gaussian Splatting for “production”: this particular runtime has integration boundaries that a captured-scene preview can conceal.

For a game, the consequence is a set of concrete tests. Move an opaque object through the captured scene. Place transparent geometry in front of and behind it. Change lighting if the design expects relighting. Overlap two imported splat assets. Record what is expected before running the tests. Collision requires its own representation and validation; this rendering audit did not establish a collision pipeline. None of those proposed scene checks was executed here.

The related LangSplat source audit follows a different extension: associating language features with splats. It demonstrates why downstream functionality and performance claims need their own evidence. The NPGA paper article provides a separate Gaussian-based avatar context; its application should likewise be evaluated on its own assumptions, rather than inheriting the static-scene comparison above.

A permissive viewer does not settle the capture pipeline’s rights

The license comparison is particularly easy to get wrong because “Gaussian Splatting” describes a method, rather than one software package. The original bmild/nerf implementation has an MIT license at the inspected commit 14c5556. The original graphdeco-inria/gaussian-splatting repository has a different license: its research-user grant concerns non-commercial research and evaluation, and its terms restrict other or commercial uses without consent. Calling both “open source, ready to ship” erases that difference.

Later implementations have their own licenses. The inspected gsplat files identify Apache-2.0. The audited community Unity renderer identifies MIT. Neither observation changes the license of the original research implementation. Nor does a renderer’s license establish that a scene file was acquired or created under terms allowing the intended use.

The Unity repository’s README makes this separation explicit: its license does not settle how the input PLY files were obtained. That is unusually useful operational guidance. It directs attention away from the viewer alone and toward the toolchain and material used to create the asset.

This article does not determine the legal status of a particular trained output. The auditable action is to record the training implementation and its terms, the renderer and its terms, and the capture or downloaded asset’s provenance separately. A permissively licensed component is evidence about that component. It is not evidence that the whole pipeline, every dependency, or every asset has the same permission.

GateEvidence to retainWhat a passing screenshot cannot establish
Capture and representationSource images, camera preparation, model/trainer revision, export formatReliable behavior outside the inspected camera paths
Runtime integrationRenderer revision and scene tests for depth, transparency, lighting, and overlapCorrect engine behavior merely because novel-view synthesis looks convincing
Code and asset rightsRelevant license files plus capture/download provenancePermission for the entire pipeline from the viewer’s license alone

Choose the evaluation boundary before choosing the representation

For an offline reconstruction experiment, image quality under a specified protocol may be the main question. For a captured environment preview, camera navigation and acceptable visual artifacts may matter more. For an interactive game asset, the runtime’s interaction with the rest of the scene becomes an additional requirement. The method name does not decide which of these products is being built.

My inference from the inspected sources is to separate the evaluation into three gates: reconstruction, runtime integration, and rights. Define a failure condition for each gate before comparing performance. A renderer that passes the reconstruction gate can still fail an interaction requirement. A renderer that meets both technical gates can still leave a license or asset-provenance question unresolved.

Only then compare speed and memory on the intended workload. Record the camera path, output resolution, scene size, hardware, settings, and exact implementation. Include the engine configuration when that is the deployment target. A paper’s timing and a standalone viewer’s frame rate are useful within their respective measurement scopes; neither is a substitute for that application-specific check.

The repaired conclusion is therefore more useful than the old winner table: explicit splats change the computation and available implementation choices, while production readiness remains a property of the complete pipeline and its requirements. That conclusion is a decision framework derived from the source audit, not a claim that either representation always wins.

Key Takeaways

  • Original NeRF and 3DGS both model view-dependent radiance. Their stored representations and rendering paths differ; neither label establishes a universal quality ranking.
  • NeRF’s density is converted to alpha using the ray interval. The executed CPU example verifies compositing arithmetic, not rendering performance.
  • Later backend features must be traced through the trainer, export, and target renderer. A backend capability does not prove an engine integration supports it.
  • The audited Unity renderer documents depth, transparency, lighting, and object-ordering boundaries. Test those boundaries against the intended scene.
  • Record trainer, renderer, and asset provenance separately. MIT or Apache-2.0 on one component does not settle the rest of the pipeline.

New Questions

  • Which depth and transparency artifacts become unacceptable along the intended player camera path?
  • Which appearance and camera parameters survive the chosen training-to-engine export?
  • Does the application need a separate collision or editable geometry asset alongside the captured appearance?
  • Can the complete capture, training, export, and rendering chain be documented with terms appropriate for the intended use?

References

Primary papers — read on 2026-10-14:

Pinned implementations and licenses — read on 2026-10-14:

Engine integration documentation — read on 2026-10-14:

Editorial method: claims in this article point to primary documentation, pinned source code, runnable checks, or dated measurements, with AI-assisted research under the site's evidence-gated policy. How this site verifies claims and discloses AI assistance · Report a correction.

Working on something like this?

I take a small number of paid, scoped reviews: AI agent/RAG architecture diagnosis, Unity CI & build-automation audits, and multimodal QA design review. Each one ends in a written findings document.

Work with me
This post is licensed under CC BY 4.0 by the author.

© Jang Young Jeong. Some rights reserved.

Search article titles, categories, and tags. Full text is searched when needed.

Type to search articles.