GaussianRenderFormer: Transformer-based Rendering of 3D Gaussian Splats
Organizations: The Hebrew University of Jerusalem
Abstract
Can a neural network learn to render 3D Gaussian splats on its own, with no rasterizer in the renderer? We present GaussianRenderFormer, a transformer that takes a set of Gaussians and a camera and outputs the image directly. Each Gaussian becomes one token in a view-independent encoder, and a view-dependent decoder turns small patches of camera rays into pixels by attending to those tokens. Trained on 26,820 Objaverse objects pruned to 20,000 Gaussians each, GaussianRenderFormer renders 300 unseen objects at 38.08 dB PSNR against the full, unpruned splats, while rasterizing the same pruned input reaches 44.02 dB. The gap is not one of generalization, and our diagnostics are consistent with a bottleneck in the view decoder: telling it the projected footprint of each Gaussian, which it could in principle infer, adds 1.4 dB. Under-training is not ruled out. Code, trained models and videos: https://svlwoof.github.io/gaussianrenderformer
Figures & tables
| Stage | Trains | Steps | Resolution | Loss |
|---|---|---|---|---|
| 1 | input layer only | 33.5k | 256 | log-L1 |
| 2 | whole model | 402k | 256 | log-L1 |
| 3 | whole model, new decoder changes | 3k | 256 | log-L1, background weight |
| 4 | whole model | 385k | 512 | log-L1 + LPIPS, background weight |
| PSNR (dB) | Masked | ||||
| Renderer and objects | 4 views | 28 views | PSNR (dB) | SSIM | LPIPS |
| gsplat on the input, fresh held-out | 44.97 | 44.02 | 39.19 | 0.9954 | 0.0046 |
| gsplat on the input, training objects | 45.01 | 44.12 | – | 0.9954 | 0.0046 |
| Ours, fresh held-out | 38.36 | 38.08 | 32.68 | 0.9814 | 0.0113 |
| Ours, development held-out | 38.36 | 38.02 | 32.66 | 0.9802 | 0.0116 |
| Ours, training objects | 38.55 | 38.25 | – | 0.9821 | 0.0108 |
| Views per call | Ours (ms) | per view (ms) | peak memory (GB) | gsplat (ms) |
|---|---|---|---|---|
| 1 | 275 | 275 | 2.8 | 0.7 |
| 4 | 685 | 171 | 7.7 | 0.9 |
| 14 | 2,012 | 144 | 13.0 | 1.2 |
| Held-out objects | Training objects | |||
| Model | PSNR | Difference | LPIPS | PSNR |
| All changes | 34.42 | 0.0224 | 35.69 | |
| No footprint | 32.71 | 0.0316 | 34.43 | |
| No 2D rotary embedding | 29.22 | 0.0467 | 30.50 | |
| patches | 31.37 | 0.0379 | 32.49 | |
| Windowed cross-attention | 34.62 | 0.0218 | 35.85 | |
Appendix figures & tables21 assets
Supplementary material from the paper’s appendix.
Appendix
| Ours | gsplat on the input | |
|---|---|---|
| PSNR per frame (dB) | 38.52 | 44.12 |
| Worst frame per object (dB) | 35.70 | |
| Spread over frames, standard deviation (dB) | 1.38 | |
| Frame-to-frame consistency, PSNR (dB) | 42.98 | 47.74 |
| Scene | Splat | Photos | Region | Input | Ours | gsplat on the input |
|---|---|---|---|---|---|---|
| Bonsai | 2.00M | 31.04 | 346,027 | 20k / 80k / 160k | 34.12 / 33.84 / 31.09 | 35.70 / 43.67 / 48.93 |
| Counter | 1.81M | 28.11 | 732,862 | 20k / 80k / 160k | 31.78 / 29.92 / 28.40 | 34.37 / 37.96 / 40.86 |
| Garden | 7.81M | 26.84 | 994,061 | 20k / 80k / 160k | 30.56 / 29.65 / 27.33 | 32.58 / 37.53 / 40.23 |
| Kitchen | 2.38M | 30.63 | 1,284,974 | 20k / 80k / 160k | 31.99 / 28.61 / 25.81 | 36.74 / 41.55 / 44.86 |
| Objects and views | Model | PSNR | Difference | LPIPS |
|---|---|---|---|---|
| Development held-out, 4 views | Before the footprint, 94k steps | 34.73 | 0.022 | |
| without the 2D embedding | 30.40 | (4.2 to 4.5) | 0.039 | |
| with patches | 32.31 | (2.3 to 2.5) | 0.033 | |
| Fresh held-out, 28 views | Final model | 38.08 | 0.0113 | |
| without the footprint | 36.67 | (1.33 to 1.48) | 0.0140 | |
| Training objects, 28 views | Final model | 38.25 | 0.0108 |
| Change | Ours | gsplat on the input | Change | Ours | gsplat on the input |
|---|---|---|---|---|---|
| Training setup | 38.74 | 45.24 | |||
| 5,000 Gaussians | 31.66 | 36.20 | 256 pixels | 33.39 | 41.03 |
| 10,000 Gaussians | 35.59 | 40.10 | 1,024 pixels | 32.72 | 41.18 |
| 40,000 Gaussians | 35.68 | 49.91 | |||
| Distance 0.9 | 37.17 | 40.28 | Field of view | 37.60 | 45.18 |
| Distance 1.15 | 38.88 | 42.63 | Field of view | 38.25 | 45.20 |
| Gaussians | Ours (ms) | Ours memory (GB) | gsplat (ms) | gsplat memory (GB) |
|---|---|---|---|---|
| 20,000 | 275 | 2.9 | 0.7 | 0.007 |
| 40,000 | 613 | 3.0 | 0.8 | 0.009 |
| 80,000 | 1,793 | 3.9 | 1.2 | 0.014 |
| 160,000 | 5,294 | 6.7 | 1.5 | 0.030 |
| 320,000 | 19,367 | 12.4 | 1.9 | 0.044 |
| 640,000 | 74,853 | 23.7 | 2.5 | 0.082 |
| Initialization and schedule | PSNR (dB) | Difference | LPIPS | Validation loss |
|---|---|---|---|---|
| RenderFormer, input layer first (ours) | 29.98 | 0.0783 | 0.00100 | |
| RenderFormer, whole model from the start | 26.85 | 0.1257 | 0.00148 | |
| RenderFormer, whole model, input layer at | 26.30 | 0.1383 | 0.00162 | |
| Random weights | 13.12 | 0.5733 | 0.01357 |
| Steps before the decay | 94,000 | 188,000 | 282,000 | 375,000 |
|---|---|---|---|---|
| PSNR (dB) | 36.20 | 37.12 | 37.65 | 38.08 |
| Share of error | In-phase gain | Unmatched power | Error, Ours | ||||
|---|---|---|---|---|---|---|---|
| Band | Ours | gsplat | Ours | gsplat | Ours | gsplat | over gsplat |
| 0 to 1/64 | 0.046 | 0.015 | 0.997 | 1.001 | 0.000 | 0.000 | 16.4 |
| 1/64 to 1/32 | 0.039 | 0.022 | 0.999 | 1.000 | 0.002 | 0.000 | 9.1 |
| 1/32 to 1/16 | 0.069 | 0.049 | 0.997 | 0.999 | 0.006 | 0.001 | 6.7 |
| 1/16 to 1/8 | 0.131 | 0.113 | 0.989 | 0.997 | 0.015 | 0.003 | 5.4 |
| 1/8 to 1/4 | 0.270 | 0.255 | 0.960 | 0.985 | 0.048 | 0.010 | 4.9 |
| Gaussians per pixel | Share of pixels | Ours | gsplat | Difference |
|---|---|---|---|---|
| 1 | 7.5% | 53.30 | 57.36 | 4.06 |
| 2 to 3 | 5.6% | 46.95 | 49.42 | 2.48 |
| 4 to 7 | 4.3% | 35.18 | 43.25 | 8.07 |
| 8 to 15 | 3.1% | 32.01 | 37.38 | 5.37 |
| 16 to 31 | 2.8% | 30.25 | 33.84 | 3.59 |
| 32 to 63 | 5.0% | 28.99 | 34.94 | 5.95 |
| Change | Setup | Effect |
|---|---|---|
| More depth: 18 + 9 layers (287M parameters) | 100 objects, earlier model | Fit 13.43 vs 13.40 |
| Wider feed-forward network ( , 322M) | 100 objects, earlier model | Fit 13.35 vs 13.40 |
| Small MLP as input layer, log-scale input | 100 objects, earlier model | Fit 13.43 vs 13.40 |
| Training from scratch | Several widths, with and without a 256-pixel warm-up | Never left a poor plateau |
| Changing the pretrained position embedding (doubled frequency) | 10 objects | Destroyed the pretrained behavior |
| Geometry-biased cross-attention | 100 objects | Fit and held-out unchanged, the model learned to ignore it |
| Object | Source | Training | Difference (dB) | Views better |
|---|---|---|---|---|
| Slipper | real scan, 1.17M Gaussians | 120,000 steps | 35 / 40 | |
| Molecule | Objaverse_Splats | 150,000 steps | 29 / 40 | |
| Tomatoes | real scan, 219,000 Gaussians | several cycles | 34 / 40 | |
| Tent | Objaverse_Splats | 150,000 steps | 28 / 40 | |
| Octopus | real scan, 1.84M Gaussians | 90,000 steps | 11 / 40 | |
| 8 other objects | Objaverse_Splats | 60,000 steps | to | 0 to 7 / 40 |
| Model | |
|---|---|
| Token width, attention heads, feed-forward width | 768, 6, 3,072 |
| Scene encoder | 12 layers, 16 register tokens, 3D RoPE on Gaussian centers |
| View decoder | 6 layers, -pixel patches, DPT head with 128 features |
| Ray embedding | pretrained embedding, rays upsampled from |
| 2D RoPE of projected positions | 16 channel pairs (32 channels) per head, patch coordinates scaled by 0.25 |
| Projected footprint | 4 numbers per Gaussian on the cross-attention keys, a zero-initialized linear layer per decoder layer (23,040 parameters) |
Neural Rendering
Neural rendering uses learned 3D scene and light representations to synthesize, edit, and relight images from new viewpoints.
See all 123 papers