Thursday, 14 February 2013

Displacement


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.

Sunday, 3 February 2013

Subdivision

Imagine has had support for Catmull-Clark subdivision of quads within its interface for a while now, but the previous implementation had several limitations: it was slow and memory-inefficient (it just brute-forced the subdivision from the original faces), it didn't support open shapes with holes and it didn't keep UVs.

I've now re-written this to use a half-edge mesh structure, which makes it faster (less duplicate work is done), it supports boundary edges (holes in geometry), supports triangles and it subdivides UV positions (linearly at preset). I've also added support for linear subdivision with no smoothing.

Once I sort out the Geometry Instance infrastructure for each object in order to allow Geometry Modifiers at render time, it should be fairly simple to add Displacement support.