层次化(Hierachy)视景体裁剪

视景体裁剪的最大优势是层次化的裁剪方法。这意味着我们的世界将被分解成一个树形结构。一旦我们裁掉了上一层的结点就没有必要去裁剪下一层的结点了,因为无论如何都是不可见的。这也就意味着我们没有必要裁剪所有的结点。我们简单的按层次结构来处理结点,这将大大的减少要进行视景体裁剪的结点的数量。没有一个层次处理的方法,视景体裁剪依旧比不进行裁剪有着较高的效率,但是没有它,问题的规模是和所有结点的数量是一个级别的。换句话说,有100个结点就要进行100次视景体裁剪计算。1,000,000个结点就要进行1,000,000次裁剪运算。某些时候我们最终花费了这么多的时间去做裁剪却发现速度并没有提高。在设计一个快速的游戏是,我们绝对不希望我们的算数运算在一个线性的规模上,除非只有23个去处理,或者是没有任何更好的方法来处理。这意味着一个层次化的的裁剪方法是有必要的。假设在100个结点中仅有1个结点是可见的,我们用二分的方式进行裁剪(这个例子非常简单)。通常的线性方法,我们要简单的测试每个单独的结点(所有这100个)并判断它是否是可见的。现在考虑二分方式。第一次的判断可以将数量减少到50,下一次判断数量减少到25,在下一次13,再下一次7,再下一次4,再下一次2,再下一次1。总共六次判断!这与100相去甚远。并且随着数量的增长,其相对于线性方法将更具优势。事实上在这种情况下,线性方法将判断N次而二分法只需判断logN次(以2为底)。

 

在这个例子中我将在我的层次化裁剪方法中使用四叉树。八叉树、二叉树或者是其他的结构也是可以的。事实上,大部分的代码都很容易地进行。我选择四叉树是因为它比较容易想象。四叉树基本上是一个二维区域用一个每个结点有四个孩子节点的树结构构成的(见图2)。在这种情况下,孩子结点占父结点的所在区域的四分之一。然后它可以被每个孩子结点重复的定义(递归)。这样定义的就是一个层次结构,每个孩子结点都被完全包含在父结点中。当我们认定父结点是不可见时,可以认为孩子节点也是不可见的。通过这样的设置方式,我们可以通过简单少量的裁剪判断来快速的裁剪数量庞大的结点。这种方式对于地形引擎是非常有利的。并且有着很好的可扩展性。我们可以在四叉树上添加我们的树木、灌木、石头等,把它们完全融入到合适的最小的结点上。

                                        层次化(Hierachy)视景体裁剪_第1张图片

 

 

基本方法

首先必须要有一个基本的裁剪的方法。这意味着我们要根据view matrixprojection matrix构造视景体的六个平面,然后判断一个包围球或者是包围盒是否在视景体外。更简单的说,我们想知道包围球和包围盒都是不是完全包含在视景体内,完全超出或跟视景体相交。这将 允许我们之后对我们的层次化裁剪做更多的调整。

 

 

优化

 

1、先判断结点的包围球是否在视景体内,如果包围球完全在视景体内则不进行包围盒测试

2、层次化处理:从顶层的结点开始处理,判断结点是否可见

a) 完全不可见:则其子结点也完全不可见;

b) 部分可见:递归的判断其子结点是否可见;

c) 完全可见:其子结点也全部可见;



详见:http://www.flipcode.com/archives/Frustum_Culling.shtml

你可能感兴趣的:(OpenGL)