调试最长的一帧(第26天)

在第25天,这个例子可能会有误导,因为用的是pagedlod的方式触发的,实际上,任何一个可绘制节点都可以,因为最终在渲染叶中,

再改到最简单,依然触发

 

 

这里没有设置,所以直接返回false

 

 

 

由以上可知,场景绘制中可以通过applyModeList和applyAttributeList不断更新两个映射表_modeMap和_attributeMap,以标识那些需要被更新的以及更新完毕的渲染状态。而这两个表用于记录当前渲染状态的执行情况,

这里没有进行对纹理的额外做法,所以,这里简单地绑定,以后调试例子时再慢慢进行

 

这里没有传递到glsl的uniform参数,所以直接返回了。以后调试例子时,可以再慢慢分析。

总结下,state::apply()分别从mode,attribute,texture和uniform4个方面。

 

这里开始整个关系图,场景图形,摄像机,图形设备,渲染器和场景视图的整个osg渲染后台全景。

继续抄一抄。

OSG渲染后台与用户层的接口时摄像机类Camera,场景中至少有一个主摄像机。

它关联了一个图形设备GraphicsContext,通常是窗口

以及一个渲染器Renderer

可以在场景树中,(或者别的视图view中,对于复合视景器而言)添加更多的摄像机,它们可以关联相同的或者其他图形设备,但都会配有单独的渲染器,用以保存该摄像机的筛选设置、显示器设置等信息。

场景筛选和绘制的工作由渲染器来完成。而图形设备GraphicsContext则负责根据不同时机的选择,调用渲染器的相关函数。例如,在单线程模式中,ViewerBase::renderingTraversals函数依次执行Render::cull和Render::Draw函数,(后者通过GraphicsContext::runOperations调用)。而在多线程模型中调用者的关系将更加错综复杂。

 

 

osg渲染后台的调度中心是场景视图(SceneView),它负责保存和执行筛选访问器(CullVisitor)'

 

CullVisitor负责遍历并裁剪场景,同时在遍历过程中构建对于场景绘制至关重要的渲染树和状态树。

生成的状态树以StateGraph为根节点和各级子节点(其中保存场景树的渲染状态StateSet数据),以RenderLeaf为末端叶节点的内容(其中保存场景树中的几何体Drawable对象);渲染树则以RenderStage为根节点,RenderBin为各级子节点,根据渲染顺序和方法的设定,状态树中的节点和渲染叶RenderLeaf被记录到RenderStage和各级RenderBin中。

SceneView负责保存和维护状态树和渲染树

 

 

..............

绘制场景时,渲染树中的各级节点将取出保存的渲染叶数据,传递给OSG状态机(State),后者是OpenGL状态机制的封装和实现,也是场景绘制的核心元件。状态机取得渲染叶中的几何数据之后,再想根部遍历状态树,取得该几何体绘制相关的所有渲染状态设置。并亲自或者交由StateAttribute派生类完成渲染状态的实际设定,以及场景元素的实际绘制工作

.......

现在单线程结束,可以学习下多线程。

抄一抄.

线程模型的选择可以概括为一个决定谁来调用SceneView::cull和Scene::draw的过程。

先注释掉单线程

从startThreading开始

 

第26天结束了,单线程结束,多线程刚刚开始,准备寒假完结它。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值