用场景树来组织场景
来源:互联网 发布:足球实时数据 编辑:程序博客网 时间:2024/05/16 08:57
osg存在两棵树,场景树和渲染树。场景树是一颗Node组成的树,这些Node可能是矩阵变换,或者是状态切换,或者是真正的可绘制对象,它既反映了场景的空间结构,也反映了对象的状态。而渲染树则是一颗以StateSet和RenderLeaf为节点的树,它可以做到StateSet相同的RenderLeaf同时渲染从而不用切换Opengl状态,并且做到尽量少的在多个不同State间切换。渲染树在CullVisitor的cull过程中逐渐创建。
SceneView包含两个与渲染相关的两个成员,一个RenderStage对象与StateGraph对象
StateGraph顾名思义,就是以状态为节点的图。StateGraph包含了真正的可渲染对象RenderLeaf,但是一个StateGraph是不够的,因为不同的RenderLeaf可能会有不同的StateSet,于是StateGraph内部包含一个以StateSet为key,StateGraph为value的Map对象,从而形成一颗渲染树
渲染时以该渲染树为基准按一定顺序逐渐渲染各个RenderLeaf。以何种方式遍历该树呢,这正是RenderStage的任务。
RenderStage从RenderBin派生
RenderBin包含了一个StateGraphList,该List将渲染树中的各个StateGraph摘取出来,形成列表。形成列表的过程就是遍历渲染树的过程。RenderStage可以在RenderBin渲染之前之后做一些预处理和后处理,以完成一些特殊效果。
RenderStage包含两种类型的RenderBin,透明与不透明的。对于Transparent RenderBin比较难处理,就是必须按深度顺序调用gl函数渲染对象,否则可能半透明会有问题。对于Opaque RenderBin则没有此限制,它只需按照尽量少切换状态的原则排列StateGraph即可。
StateSet的SetRenderingHint函数可以用来控制使用那个RenderBin进行渲染,题外话,StateSet的setAttributeAndModes函数可以指定AlphaFunc与BlendFunc,前者功能相当于Alpha测试,后者则反映了Alpha混合的方式。使用方式类似下面:
BlendFunc* func = new BlendFunc();
func->setFunction(...);
dstate->setAttributeAndModes(func, StateAttribute::ON);
可以参考的相关osg代码:
void CullVisitor::apply(Geode& node)
void CullVisitor::addDrawableAndDepth(osg::Drawable* drawable,osg::RefMatrix* matrix,float depth)
StateGraph的部分函数。。。
void RenderLeaf::render(State& state,RenderLeaf* previous)
void RenderBin::drawImplementation(osg::State& state,RenderLeaf*& previous)
void RenderStage::drawImplementation(osg::State& state,RenderLeaf*& previous)
- 用场景树来组织场景
- Ogre场景组织分析
- 魔兽世界场景组织浅析
- 简单的场景组织
- OSG 场景的组织结构
- 3D游戏场景数据的组织
- OSG 学习第一天:场景的组织及渲染
- QD的大用场
- C++的用场
- 组织
- 组织
- 常用集合类用场概括
- String.format 的大用场
- String.format 的大用场
- String.format 的大用场
- 调试器确实能派上用场
- 调试器确实能派上用场
- .ldb文件到底派什么用场得?
- flysoft.image 缩略水印组件
- 早接触Debian,会少走很多弯路
- Berkeley DB -- 入门知识和一个小例子
- fork函数——多进程编程,其实也不是很难
- TXT.WORD文档下载在本地,而不是在浏览器中打开
- 用场景树来组织场景
- CSS应用小技巧十四例
- 常用CPLD/FPGA 标识的含义
- 网络游戏发展历史
- 架构(SOA)安全标准 过犹不及?
- 测试MS面试题
- 全角、半角字符相互转换
- 一个程序员的成长的六个阶段
- 简单状态机Workflow基于Web应用