4.3RenderState及其更新
来源:互联网 发布:移动电玩城源码 编辑:程序博客网 时间:2024/06/08 01:09
主要的RenderState分为global state,lights和effects。
一,抽象基类GlobalState
该类为一个抽象基类,所有的全局状态类型如alpha blending,triangle culling,material,polygon offset,stenciling,wireframe,depth buffering等都要基于该类创建。Node,Geometry均有相关接口用于global state的存储,加载和移除。
这些派生类有两个共同点:(1)都要重载虚函数GetStateType。
(2)都要在program initialization时创建默认对象,在program termination时销毁对象。
二,Lights
Lights的作用结果与material密切相关。
经过多次更改和权衡(p261-p263),作者最终决定将Light类写成一个通用类,其中包含了所有类型的光源所需的信息,并定义了枚举类LightType,以标识对象的光源模型。接口略。
三,effects。详见chapter3.4
四,RenderState的更新。
当下列事件发生时,RenderState需要更新:(1)attach/detach global states (2)attach/detachlights (3)attach/detacheffects (4)场景图的拓扑结构改变。
RenderState更新的顶层接口相对于geometry state要简单,只有一个:UpdateRS()(在spatial中)当上述情况发生时,调用UpdateRS()即可。注意,如果仅仅是RenderState的某个数据成员发生改变,则没有必要调用UpdateRS,因为场景图中每个节点存储的是RenderState的智能指针,而不是RenderState本身,因此,一旦RenderState的内容发生改变,所有共享该类的节点会马上感应到这一点,从而在draw的时候体现出来。
下面给出UpdateRS的函数调用图:
说明:N1为RenderState更新的触发点。
N1 UpdateRS()
声明Gstack,Lstack
PropagateStateFromRoot parent---àPropagateStateFromRoot(),向上
PushState,向上递归结束。
UpdateState
销毁Gstack,Lstack(递归的终点)
若N不是触发点:
PushState
UpdateState 对每一个chilid
N Child-àUpdateRS(),(向下递归开始。)
PopState(向下递归结束
(node)
UpdateState(Geometry)--à将栈中RenderState复制到本地。
向上递归的目的是在栈中加入触发节点之前所有父节点的RenderState,以便传给子节点。
向下递归的目的是将当前节点的所有RenderState传给子节点(本质是覆盖子节点的本地RenderState)。
读者可能会有此种想法:不用当前节点的RenderState去覆盖子节点的RenderState,而是通过修正,即当前节点中没有的不做任何动作,多出来的就添加进去,这样就可以免去覆盖,从而省略了PropagateStateFromRoot这一步。这是错误的。例如,某子节点被一个新的子节点替换,这是如果没有PropagateStateFromRoot(),就无法获得新子节点的全部RenderState。
当然了,添加PropagateStateFromRootr()的缺点是对于原有节点来说,这一步是多余的。
一点说明:Gstack,Lstack并不仅是一个栈,而是栈数组,每种类型的RenderState拥有一个栈,这是因为可能出现多个同类型的RenderState连接到一个节点的情况。
- 4.3RenderState及其更新
- 可更新视图及其规则
- 4.2 Geometric State及其更新
- 32.Android SQLite 及其更新
- Cocoapods的更新及其过程
- device.RenderState.Lighting与device.Lights[0]的关系
- 《计算机病毒及其防范技术》教材资源更新
- 集合表示及其运算(持续更新)
- ubuntu内的工具更新及其安装
- R软件及其包的更新
- [Android] UI 的更新及其线程模型
- 四,更新 A apt-get及其前端synaptic
- PictureStudio开发笔记04-工具栏的动态更新及其它
- 《LINGO8.0 for Windows软件及其应用》要更新了
- Eclipse集成的一些插件及其在线更新地址
- 常用函数及其使用格式(持续更新中.......)
- 深入分析linux内核及其应用(更新完毕)
- iOS开发常见错误及其解决方法(长期更新)
- 4.1 scene graph构建的基本问题
- log4j 1.3 配置
- 猛料真相大白:云计算 梦幻的泡影
- 4.2 Geometric State及其更新
- BlackBerry模拟器中文转换
- 4.3RenderState及其更新
- log4j 1.2 配置 xml
- 4.5the Culing Pass
- BlackBerry资源网站
- win7开机黑屏开计算机无桌面图标任务栏
- interface ---接口 的简单应用
- 4.6the Drawing Pass
- 关于停车场管理的问题
- 4.7 Scene Graph Compilers