BSP vs AABB tree

I often read BSP trees are ‘good’ for indoors and ‘bad’ for outdoors, but one can easily have a BSP tree subdivide the same subspaces as an AABB tree. So what are the real reasons for a BSP tree being bad outdoors?

BSP is good when few polygons are visible, and a lot are occluded.
But does not scales well with visible high polycounts.
Plus indoor one can hope a lot of planes are shared (ceiling, doors and windows are of same height, etc). Outdoors, not so well.

For outdoors it is more interesting to use occlusion queries when drawing terrain by block and big occluders, plus have a good LOD system on top.

What would a BSP ‘leaf’ look like outdoors? Seems like potentially visible set calculations would be pretty useless for outdoor leaves, since they would extend upwards and everyone would be visible to everyone.

As far as PVS calculations outside are concerned, one could still take into account occluders. After all, even with AABB trees, a lot of ground might be visible. I’ve seen some articles for outdoors PVS.

A BSP leaf would contain the tris contained in the region subdivided by the dividing planes, like always. Example:

Say I had a rectangular grid, containing geometry, like this:


I could choose z = C, x = K, y = L dividing planes and achieve the same as with an AABB tree.

So, ZBuffer, you mean to say, that constructing an outdoors BSP tree is not a good idea - it takes too long. Evaluating if a splitting plane is good can take some time. But one could choose a simple rule for generating splitting planes. And the amount of split polygons increases with scene complexity. Still, AABB trees can split geometry also. Some AABB tree construction algorithms split the parent AABB with a plane similar to constructing a BSP tree.

I’ve wondered as well how a bsp might do in a highly occluded outdoors scene, say like city streets??

I guess the question is what you are trying to get from the BSP or AABB? If it is PVS, it seems like a hard sell. But the bsp could still be very useful for location queries and grouping poly’s to locales. A kd-tree might do just as well, though, and would be simpler to implement…

How can you write something like that, there are many different PVS algorithms. What PVS algo did you have in mind?