4.5the Culing Pass

来源:互联网 发布:移动电玩城源码 编辑:程序博客网 时间:2024/06/11 02:04

WM4中,culling pass drawing pass是分开的,负责该流程的三个核心类是VisibleObjectVisibleSetCuller。下面一一详述。

一,VisibleObject

该类实际上是一个结构类,有两个public成员:Spatial*ObjectEffect*GlobalEffect

前者用于存储单个的潜在可见的物体,后者用于存储与Node节点相关联的globaleffect。(在绘制中大有作为)。

 

二,VisibleSet

该类用于存储潜在可见物体的集合,并建立一个索引表用于绘制,详见p197.

Public

  Void InsertSpatial*pkObjectEffect*pkGlobalEffect);

  //如果要插入的是Geometry,那么Effect指针设为空,如果要插入的是Node,并且关联了global effect,那么effect指针指向那个Global Effect

带有global effectNode类,是一种特殊信号,标记了global effect的起始点,而一旦该Node子节点的遍历结束,另一个符号被加入VisibleSet,用于标记global effect的终点。

 

三,Culler

该类用于(1)管理对场景图的剔除(2)管理对潜在visible set的存储。(如insert

Culler类中维护了一个VisibleSet,用于存储剔除后得到的物体。

首先将指向整个场景的Spatial指针传给Culler,然后Culler类调用Spatial接口并将该Culler类传给接口,遍历过程由Spatial实现,但其中会用到Culler中的剔除函数。

 SpatialCuller互相依赖,紧密结合。

 

Spatia::OnGetVisibleSet()调用GetVisibleSet,如果调用者是NodeGetVisibleSet中会继续调用OnGetVisibleSet(对每一个节点),形成递归。

关于PlaneState,适用于标识该平面是否被激活,若检测到一个节点完全位于平面外,则节点下的每一个子节点均不需要检测,因此将PlaneState设为未激活,只需继承父节点的检测结果即可。

 

 总结:递归的结构基本分为两种(1)自身调用自身。

                              2A调用BB调用A……..直到A返回。(有的A并不调用B,直接返回,通过多态性实现)。

   递归函数体分为三大块:(1)递归前的准备

                         2)递归(循环调用)

                          3)递归后准备。

   1)(3)可能没有,但(2)一定有,(1)和(3)往往相互呼应。

 

 

Culler的核心函数是IsVisible(),待研究!!!

另外,在按空间关系结束cull后,可以再进行RenderState排序,然后draw

另外,也可在Cull的过程中进行某种规则的排序(重载GetVisible即可)。

例如,以后要介绍的Portal System

原创粉丝点击