Voxels - how feasible?
Hello guys
I have been playing Doom and its related games for the first time recently and I have enjoyed Doomsday Engine enormously, and if there is one feature I would love to see added it would be voxels. I have to say I can't stand the look of modern lighting and 3D models in Doom, but I think that the voxel project captures the aesthetic of the 2D sprites perfectly.
I took a look at the issue and from what I have gathered the engine would need to turn the voxel information into a mesh to display with OpenGL. I know that the Polymost renderer by Ken Silverman for Duke Nukem 3D is OpenGL accelerated and supports voxels (there is a voxel pack for Duke 3D as well), so it is possible to display voxels, the question is "how". From what I understand the voxel information needs to be used to build a 3D mesh that can then be used like any other 3D model mesh, and since Doomsday already supports 3D models the meshing itself is the tricky part.
I have found two articles on that topic:
http://0fps.wordpress.com/2012/06/30/me ... raft-game/
http://0fps.wordpress.com/2012/07/07/me ... ft-part-2/
The article discusses four algorithms. The first one is pure brute force, each voxel becomes a cube (six quads) and the second one uses occlusion to hide voxels on the inside, both algorithms are not very good.
The third one is no more than factor 8 times worse than the best possible mesh, it uses a greedy sweepline algorithm to find the smallest mesh in each dimension, reducing the one 3D problem to three 2D problems. The results are pretty good and it still uses quads. The fourth algorithm (second article) uses polygon triangulation, so there are no quads. If that's a good thing or a bad one I can't say. There is also a web demo to compare algorithms:
http://mikolalysenko.github.io/MinecraftMeshes2/
The next problem is the texture. The way it's solved in the article is to simply treat each colour as its own voxel model, but then the mesh will have more faces than it would if everything had the same colour. The voxels from the voxel pack make heavy use of dithering, just like the sprites did, so this would yield results similar to the brute force algorithm. A better idea would be to treat the voxel model as one shape and then use the result to somehow construct a texture that's then applied to the mesh.
What do you guys think?
I have been playing Doom and its related games for the first time recently and I have enjoyed Doomsday Engine enormously, and if there is one feature I would love to see added it would be voxels. I have to say I can't stand the look of modern lighting and 3D models in Doom, but I think that the voxel project captures the aesthetic of the 2D sprites perfectly.
I took a look at the issue and from what I have gathered the engine would need to turn the voxel information into a mesh to display with OpenGL. I know that the Polymost renderer by Ken Silverman for Duke Nukem 3D is OpenGL accelerated and supports voxels (there is a voxel pack for Duke 3D as well), so it is possible to display voxels, the question is "how". From what I understand the voxel information needs to be used to build a 3D mesh that can then be used like any other 3D model mesh, and since Doomsday already supports 3D models the meshing itself is the tricky part.
I have found two articles on that topic:
http://0fps.wordpress.com/2012/06/30/me ... raft-game/
http://0fps.wordpress.com/2012/07/07/me ... ft-part-2/
The article discusses four algorithms. The first one is pure brute force, each voxel becomes a cube (six quads) and the second one uses occlusion to hide voxels on the inside, both algorithms are not very good.
The third one is no more than factor 8 times worse than the best possible mesh, it uses a greedy sweepline algorithm to find the smallest mesh in each dimension, reducing the one 3D problem to three 2D problems. The results are pretty good and it still uses quads. The fourth algorithm (second article) uses polygon triangulation, so there are no quads. If that's a good thing or a bad one I can't say. There is also a web demo to compare algorithms:
http://mikolalysenko.github.io/MinecraftMeshes2/
The next problem is the texture. The way it's solved in the article is to simply treat each colour as its own voxel model, but then the mesh will have more faces than it would if everything had the same colour. The voxels from the voxel pack make heavy use of dithering, just like the sprites did, so this would yield results similar to the brute force algorithm. A better idea would be to treat the voxel model as one shape and then use the result to somehow construct a texture that's then applied to the mesh.
What do you guys think?
Comments
However, at the moment I haven't got a clue what would be the best approach to the sprite-to-voxel conversion. I have a feeling that manual work would provide the best results.
http://www.teamhellspawn.com/voxels.htm
Personally, if I were going to implement a dedicated voxel renderer then I would be doing so for things like dynamic geometry deformation and soft body simulations.
EDIT: just to clarify, I was only talking about voxels for replacing the static objects like pickups and stuff like pillars or switches, not dynamic geometry or deformable terrain. Basically like this:
http://www.youtube.com/watch?v=CAdOkSVGwfA
Voxel Doom 1.0
Youtube Channel
Compared to the older ones the author is also creating replacements for the monsters, gibs, corpses etc. The voxel dor DOOM are done and he is currently working on the DOOM II stuff.
I'm wondering if the current or future doomsday renderer could / would make use of this mod....