Question submitted by (09 September 1999)
|Return to The Archives
|First of all, I find your column really cool and after some weeks of wracking my brain I have come to the point where I need some help. To put things in context, I'm developing a 3D engine targeted for 3D accelerator platforms and have some decisions to make regarding the implementation. One of my main concerns is texture switching. Say I'd want to use octrees/kd-trees/bsp or a similar mechanism. This means that polygons are thrown at the drawing code in a seeming random fashion (with regard to the texture they use). I did some testing and several hundred switches are okay, but the more polygons get processed the more switching will eventually occur (and performance will go down the drain). A solution I may have come up with is to traverse the structure and store the results in a preliminary structure, which is texture sorted. Then, go ahead and traverse this structure and draw the stuff. Obviously, this preliminary structure will be pre-allocated and not allocated and freed for each frame. Is this aproach good enough, or do you guys know something better? How would you handle lightmaps (to reduce texture switching in the second texture unit)? I guess, if you don't have the second texture unit, a second preliminary structure would suffice... Well, what do you think about all this?
Sorting by texture is good, but be careful! If it takes a long time to
build that list (i.e. gather up the polygons that will need to be
rendered) then you're losing the advantage of having the 3D card render
while you work. You might consider sending polygons to the card (including
texture switches) while you build the list, but only do this if the card
isn't busy. The polygons that came in while the card was busy will get
stuck into a list and sorted/rendered last. At least this keeps the card
busy while you build & sort the list.
Lightmaps are unique per surface, and simply require the texture switches. Just make sure you have a clever texture caching mechanism.
Response provided by Paul Nettle
This article was originally an entry in flipCode's Fountain of Knowledge, an open Question and Answer column that no longer exists.