在第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天结束了,单线程结束,多线程刚刚开始,准备寒假完结它。