A question from ignorance about Voxels and DX12/Manlte.

Osamar

Newcomer
If I am not wrong voxels ar every CPU dependant.

Which could be the benefits of new APIs for voxels?
Better CPU use? CPU-GPU mixed voxel engines? Any of them and something new?

PD. I just want a voxel Oucast HD (and have nothing against the HD remake)
 
Heightmap ray tracing on GPU is quite fast. Many new games are actually using this technique for screen space reflection ray tracing (depth buffer is a height field). I don't see any problem using similar technique for terrain rendering.
 
Don't forget we have Resogun on PS4 doing this already, all voxels, done on GPU.
 
Resogun voxels are really just small polygon cubes though, aren't they?

The level data as stored in the PS4's memory are voxels or a voxel-like format, but on-screen graphics is rasterized in a traditional manner - IF I understood the youtube interviews and such correctly, that is! :)
 
Yeah, I wouldn't call Minecraft a voxel game by any stretch of the word. Everything in that game is made of rasterized polygons.
 
Old-style voxel games like that Commanche helicopter sim whatsitscalled, Outcast and the like drew voxels like a solid color point sprite. Not as polygons.
 
It was called "Comanche", with sequels Werewolf and Comanche 3. I had Werewolf when it was years old at that point, still looked interesting ; they simply used sprites for the choppers, missiles and ground targets.

I thought Comanche 3 screen captures looked incredible. I downloaded the game a couple years ago intending to run on a Pentium 3 machine under DOS, sadly it didn't work. So I never saw it running.. It has a lot more precisions, helicopters and stuff made of polygons and high resolution is supported (i.e. at least 40x480, 800x600, 1024x768)

I still wish for some software rendered games to be made, just to play something different. And no need to have a PC with adequate hardware, you run it and that's all.
 
But that was an awesome link (even the page's presentation, color scheme etc. are lovely)
It doesn't look like sprites so much when the voxels are bilinear filtered. (but maybe the notion of point sprite is flexible like that)

It fact that reminds me of an article that said adamantatly that a pixel is not a little square. The author was seemingly angry at people having such a limited view. For one thing a pixel can be a little rectangle instead, but in truth it's point data and can be represented in many ways. A perfect grid of squares is only one arbritrary representation. It follows that voxels are the same.

Here is it :
http://www.cs.princeton.edu/courses/archive/spring06/cos426/papers/smith95b.pdf
 
No, he just means that the voxels are drawn as point sprites, although determining what to render on screen is achieved via raycasting.
Yes, indeed. Thank you. :)

But that was an awesome link (even the page's presentation, color scheme etc. are lovely)
It doesn't look like sprites so much when the voxels are bilinear filtered.
How would you bilinear filter a voxel? They're solid color, so there's no color difference to interpolate between...
 
No, he just means that the voxels are drawn as point sprites, although determining what to render on screen is achieved via raycasting.

Voxel is just a data structure having a representation of a 3D scene. Drawing the voxels is same as drawing the scene. Point sprites and Raycasting are two different approaches to render voxels although ray-casting will give you much better results.

How would you bilinear filter a voxel? They're solid color, so there's no color difference to interpolate between...

Voxels generally don't have color values but some scalar value like intensity or heightfield. Filtering is a way to reconstruct data or filling in the holes. It can be applied to any data source and not just a RGB texture value.
 
How would you bilinear filter a voxel? They're solid color, so there's no color difference to interpolate between...
Pixels are solid color as well, and you can still bilinear interpolate between them. Bilinear filtering between color voxels is the same operation as bilinear filtering a 3d texture (bilinear filter two xy (2x2) layers and then linear filter them together by the z).

Rendering voxels that are larger than one screen pixel have similar aliasing problems as rendering pixels to screen that are larger than one screen pixel. For the edges, you can do alpha blending (bilinear filtering the alpha, usually using the precalculated percentage in each pixel/voxel based on some more detailed shape it tries to present), or you can do a cut-off (at some alpha value). For cut-off it's best to create a distance field (from the high quality shape the bitmap presents) and fill the alpha channel by the distance field results. This upscales very well (without any visible pixelization/voxelization). It's a very good technique if you need to scale a bitmap (pixels or voxels) bigger than 1:1. Distance fields are also easy to ray trace.
 
No.

They raycasted the heightfield.
To get it done in reasonable speed games used optimization method called wave surfing.
http://www.flipcode.com/archives/Re...rt_2_Rendering_the_Landscapes_Structure.shtml
We also had a voxel based terrain engine in our Nokia N-GAGE game Pathway to Glory (2004). It used similar technique as this "wave surfing". Basically the algorithm goes through the screen from down to up one vertical scanline at a time, and renders textured line segments. Actually we rendered from right to left and then transposed the whole screen (it was more CPU cache efficient this way). Even the 100 MHz NGAGE ARM CPU (it didn't even have a floating point unit) managed to render a voxel terrain at 30 fps. Only the internal (texture line) loop was written with assembler (everything else in the graphics engine, except for scan line blitters was pure C).

This "wave surfing" algorithm is not possible on GPUs, unless you have one thread per vertical scanline (not one thread per pixel like most algorithms use). So you will only have 1920 threads, and unfortunately that's not enough to fully utilize a modern GPU. You'd want to aim for at least around 20k total threads (preferably more to hide latency better). If you want to wave surf on a GPU (compute shader), you could split the screen 24 pixel long vertical segments, and that gives you 1920*45 = 86.4k threads for the whole screen. It wouldn't be quite as efficient as the CPU algorithm, but GPUs have much more computational power and bandwidth, so this would definitely be fast enough for real time use (it would take just a few milliseconds tops when optimized properly). However four degrees of freedom (inherent limitation of "wave surfing") is quite limited for modern games (no camera rolling), so this algorithm wouldn't be good enough for most cases.
 
We also had a voxel based terrain engine in our Nokia N-GAGE game Pathway to Glory (2004). It used similar technique as this "wave surfing". Basically the algorithm goes through the screen from down to up one vertical scanline at a time, (...)

(...) However four degrees of freedom (inherent limitation of "wave surfing") is quite limited for modern games (no camera rolling), so this algorithm wouldn't be good enough for most cases.

Put this way it really makes me think of good old Doom and Doom 2. Raycasting, same degrees of freedom and same limitation to rendering a heightmap :p
Maybe you can fake looking up and down the same way as in Duke Nukem 3D? (or ROTT)

This discussion also makes me puzzled about how did Rescue on Fractalus work. Here's the better implementation of it apparently. ... I was shocked to watch it again, expecting some kind of Comanche-like without texturing but it has camera rolling :oops:
http://www.youtube.com/watch?v=FbZ-chrOgGg
So, htf did they do that (or htf did the author do that). Surely no voxels are involved, as the computer has only 64K RAM and little processing power (and C64 version is much slower)
 
Voxels generally don't have color values but some scalar value like intensity or heightfield.
Not sure that's an absolute truth in games (not that there are very many voxel games around, really); in Outcast the ground is essentially a texturemap. Definitely not colored according to height, intensity or such. In the medical field, colored voxels in an MRI scan correspond to the inner structures of the subject having been scanned, and so on... :)
 
Most of the medical dataset I have seen are just 16-bit floats. The color is assigned based on intensity from a lookup table. But really its just a data structure so you could use anything depending on your needs. Although having more values would put pressure on bandwidth while rendering.
 
Back
Top