4.3RenderState及其更新

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

主要的RenderState分为global statelightseffects

一,抽象基类GlobalState

    该类为一个抽象基类,所有的全局状态类型如alpha blendingtriangle cullingmaterialpolygon offsetstencilingwireframedepth buffering等都要基于该类创建。NodeGeometry均有相关接口用于global state的存储,加载和移除。

   这些派生类有两个共同点:(1)都要重载虚函数GetStateType

                          2)都要在program initialization时创建默认对象,在program termination时销毁对象。

 

 

二,Lights

Lights的作用结果与material密切相关。

经过多次更改和权衡(p261-p263),作者最终决定将Light类写成一个通用类,其中包含了所有类型的光源所需的信息,并定义了枚举类LightType,以标识对象的光源模型。接口略。

 

三,effects。详见chapter3.4

 

四,RenderState的更新。

当下列事件发生时,RenderState需要更新:(1attach/detach global states  2attach/detachlights  3attach/detacheffects    (4)场景图的拓扑结构改变。

  RenderState更新的顶层接口相对于geometry state要简单,只有一个:UpdateRS()(spatial中)当上述情况发生时,调用UpdateRS()即可。注意,如果仅仅是RenderState的某个数据成员发生改变,则没有必要调用UpdateRS,因为场景图中每个节点存储的是RenderState的智能指针,而不是RenderState本身,因此,一旦RenderState的内容发生改变,所有共享该类的节点会马上感应到这一点,从而在draw的时候体现出来。

 

下面给出UpdateRS的函数调用图:

说明:N1RenderState更新的触发点。

N1                       UpdateRS()

            声明GstackLstack

            PropagateStateFromRoot                     parent---àPropagateStateFromRoot(),向上

                                             PushState,向上递归结束。

 UpdateState     

            销毁GstackLstack(递归的终点)

 

 

N不是触发点:

               PushState

                        UpdateState               对每一个chilid

 N                                   Child-àUpdateRS(),(向下递归开始。)

               PopState(向下递归结束

                 (node)                     

 

 

UpdateStateGeometry--à将栈中RenderState复制到本地。

向上递归的目的是在栈中加入触发节点之前所有父节点的RenderState,以便传给子节点。

向下递归的目的是将当前节点的所有RenderState传给子节点(本质是覆盖子节点的本地RenderState)。

 

 

  读者可能会有此种想法:不用当前节点的RenderState覆盖子节点的RenderState,而是通过修正,即当前节点中没有的不做任何动作,多出来的就添加进去,这样就可以免去覆盖,从而省略了PropagateStateFromRoot这一步。这是错误的。例如,某子节点被一个新的子节点替换,这是如果没有PropagateStateFromRoot(),就无法获得新子节点的全部RenderState

   当然了,添加PropagateStateFromRootr()的缺点是对于原有节点来说,这一步是多余的。

 

 

   一点说明:GstackLstack并不仅是一个栈,而是栈数组,每种类型的RenderState拥有一个栈,这是因为可能出现多个同类型的RenderState连接到一个节点的情况。

原创粉丝点击