Thursday, 14 February 2013
I've now added initial support for displacement of geometry after subdivision using displacement maps. It's far from perfect yet - it's quite slow when subdividing to the number of levels required for decent results (the two cubes above are 6.2m faces, subdivided 10 times), and the Half-Edge data structures I'm using for subdivision use a fair amount of memory, and there's a very slight amount of faceting that doesn't look normal.
The first two issues (speed and memory consumption) I can probably fix quite easily by making my Half Edge data structures more compact and efficient - currently, each Half Edge Vertex, Half Edge Edge and Half Edge Face store pointers to each other which while easy, consumes more memory than required. Converting them to using offset indexes (like my KDTree does) should bring memory usage down by half (instead of storing an 8-byte pointer, it's possible to store a 4-byte uint_32 for an offset into a table).
It's also not on-the-fly micro-polygon displacement - that's more difficult (and slower while rending), can only be done on triangles (loop SubD is the normal variant) but uses much less memory and allows easy adaptive stopping criteria by checking each edge length in camera-space to see whether it's smaller than a pixel yet.
There's also vector displacement (displacement in three dimensions, as opposed to simply along the vertex's normal), which should be pretty trivial to implement.