Voxel Displacement Renderer – Modernizing the Retro 3D Aesthetic
blog.danielschroeder.me
blog.danielschroeder.me
That video looked great, and (at least for me) felt very evocative. In the section where the roof was too low, I started feeling claustrophobic and cramped.
Those rock and sandy-floored caverns, and the cavern with boulders (which are gorgeous!) made me think I'd love playing a Myst or LucasArts-style adventure game using this as the renderer. Spelunking through caves, or archeological digs, etc.
Can't wait to see where you take this!
The example from Back To Saturn X2 can be played on a software rendered engine with no concept of polygons at all.
2.5D would be the semi top down games such as most beatem-ups allowing you to roam around instead of just going left/right as the typical platform or action game, or most SNES RPG's.
I don’t think it’d make for a very good game though.
But the engine would need to be crazy optimised to handle decent sand/fluid voxels in 3D space. It would be a technical achievement in itself.
my issue with it that it looked so good, but the architecture felt wrong. in the part with the low ceiling, it felt like those blocks hanging from the roof were defying physics
Deep Bump is a machine-learning tool which takes texture images and creates plausible normal maps from them. It's really good at stone and brick textures like the ones this voxel displacement renderer is using. It's OK at clothing textures - it seems to be able to recognize creases, pockets, and collars, and gives them normals that indicate depth. It's sort of OK on bark textures, and not very good on plants. This probably reflects the training set.
So if you're upgrading games of the Doom/Wolfenstein genre, there's a good open source tool available.
The article in this thread is more about a small-voxel-based representation of displacement maps. A tool like Deep Bump could conceivably be used to aid in the creation of texture assets for the system discussed in this thread.
This voxel approach preserves the aesthetics of the old pixelated (now voxelated) graphics in a much more pleasing way.
DeepBump might be able to extract 1D (height only, not full 3D vector displacement) maps to use with traditional displacement though.
[1] https://media.moddb.com/cache/images/mods/1/55/54112/thumb_6...
[2] https://media.moddb.com/cache/images/mods/1/55/54112/thumb_6...
> Now that I’ve laid out all this context, I want to give a shout out to the Voxel Doom mod for classic Doom. The mod’s author replaced the game’s monsters and other sprites with voxel meshes to give them more depth, some very impressive work. Then, in late 2022, he began experimenting with using parallax mapping to add voxel details to the level geometry. This part of the mod didn’t look as good, in my opinion — not because of the author’s artwork, but because of the fundamental limitations that come from using parallax mapping to render it. This mod wasn’t the inspiration for my project — I was already working on it — but seeing the positive response the mod received online was very encouraging as I continued my own efforts. ↩
It does say though that the approach supports animated doors and stuff so combined with mesh and texture flipbook I think it could be used for original doom looking monsters too, but sharp curvature areas I think have the most artifacts with shell mapping and he mentions limitations to the meshing of levels so maybe not.
I remember one motivation for using voxels in older games (like Comanche[1]) is that you can get seemly more complex terrains that, when modelled using triangle meshes, would have been more expensive on similar hardware. The author mentions 110FPS on a RX 5700 XT, I am not sure how that compares to other approaches.
[1] https://en.wikipedia.org/wiki/Comanche_(video_game_series)
Nanite assumes high poly authoring of objects and works to stream in simplified chunks such that the rendered triangles are not less than a pixel wide. Displacement maps are a bit redundant because geometry can be naturally very detailed, there's no reason to use a texture map for it. (There is a case for Landscapes but that's a unique case)
This seems to be using a displacement and a low poly mesh to generate high poly but 'voxelized' geo on load.
Nanite can use displacement maps and perform tessellation, but it uses an alternate pathway that's not necessarily more efficient than feeding it a high-poly asset to render.
The techniques they're drawing on mentioned in the post - parallax mapping, shell mapping - do not generate explicit geometry, rather they rely on raymarching through heightfields in the frag shader. It's more likely that they're doing something like that.
(They called it "VoxelSpace" ... so some confusion is warranted)
The reality is that Comanche was more like a displacement-map twist on the Doom "2.5D" than something that really deserves the term "voxel". But it was so magic, did anything else ever come close?
Contrary to popular belief, those games didn't use true 3D voxels - they used a heightmap that stored a color and height value in the terrain texture which they raymarched into.
You could recreate the same look with raymarching into the texture in a shader which I suspect would look very similar to what the blog post achieved..
It's a bit unfortunate the article conflates voxels with a specific rendering technique. Voxels are just the usage of the 3d grid. It seems like based on the middle section that the author is equating voxel usage with cubic style rendering, or what we often call bloxel renderers (Minecraft).
It is also mentioned that the triangle geometry can be import d and used in engines directly, but I think the author is forgetting that bloxel, or really any rendering process can do the same thing, this is how typical voxel rendering plugins that use other styles already get first class support in existing engines.
If you do your tesselation inside the vertex shader, then you can send a low-poly mesh to the graphics card, which saves a lot on vertex buffers (e.g. uv coordinates and other per-vertex attributes). The vertex shader still emits the same number of vertices to the rest of the pipeline, but inter-stage bandwidth is more plentiful than CPU-GPU bandwidth so I can see that coming out ahead.
I’m not an expert though. Perhaps someone with a better understanding can clear this up, I’m curious too…
Displacement maps can closely approximate the geometric detail of having 1 triangle per pixel. All the work for displacement maps happens on a per-pixel basis inside a fragment shader (in simple terms, a little program that runs for each pixel of a triangle). You can wrap this displacement map over a single, large triangle and get the visual appearance of a much denser mesh.
The alternative approach of subdividing the mesh is orders of magnitude less efficient because GPUs are _very_ bad at drawing tiny polygons. It's just how GPUs and the graphics pipelines are implemented. A 'tiny polygon' is determined from how many pixels it covers, as you start dropping below a couple dozen pixels per triangle you start hitting nasty performance cliffs inside the GPU because of the specific ways triangles are drawn. Displacement maps works around this problem because you're logically only drawing single big polygons but doing the work in a shader where the GPU is much more efficient.
I think you're wrong here... Can you provide an example of an engine where this is actually the case? To my knowledge (and I checked on Wikipedia [1] to make sure), a displacement map simply displaces VERTICES along their normals (so white color moves a maximum distance along normal, and black either doesn't move at all or moves maximum distance along the inverted normal - inwards). This means you need to heavily subdivide your geometry. Or you can remesh your geometry, with the simplest remeshing algorithms being just voxelizers - and that's what we see the OP doing - except in the place where all the 3D graphics complain on the limitation of voxelization, he hypes it as this new retro look he invented.
What seems to confirm my interpretation of all of this is how the OP describes this being done on the CPU, and - while he tries to downplay it - using rather decent hardware - I mean, Steam Deck is not exactly ancient hardware, and for an extremely simple scene with nothing else going on, he's happy being above 60 FPS on 800p resolution!
On the other hand, UE5's Nanite achieves the same LOD scaling but far better, without the limitation of not being able to scale down past the base mesh and with a built-in workaround for the issues GPUs have with small triangles. It's possible that people might use displacement maps in the authoring process, which can then be baked into static meshes for Nanite. Then it would just be a convenient-ish way for artists to author and distribute complex materials.
How the hell do people get into graphics programming or voxels? Seems very difficult as a dirty ol webdev
There's a lot of tutorials around. You can also join a game jam for some motivation / community.
Time to make a start!
Stretch goal, dynamic lighting — like someone carrying a torch ahead of you in a tunnel and illuminating as they went.
To be sure though, the retro vibe is 100% nailed as is.
Also, Duke Nukem Forever 2013 with Eduke32 had some voxel models I think.
In any case I am at the third read and I think I understood enough to say "wow, looks and feels great. Would play TES Arena like that."