探索未知种族之osg类生物---呼吸分解之渲染遍历二

news/2025/2/26 5:05:05

rendertran

那么今天我们就正式进入osg整个呼吸动作之中最复杂的一个动作,ViewerBase::renderingTraversals(),我们先介绍renderingTraversals的开头的简单的几步操作。

      • 1、这个函数中先遍历了所有的view中的相机节点分别取得他们的位置Translation以及姿态Rotation,并保存到osg内置的log系统中。
      • 2、得到所有的渲染上下文contexts,然后使用 ViewerBase::checkWindowStatus 检查是否存在有效的渲染上下文,没有的话,需要使用 ViewerBase::stopThreading 释放每个camera对应的渲染器以及停止所有的图形线程和相机线程的运行。
      • 3、记录渲染循环开始的时间,最后会相应的进行统计,此次渲染循环进行了多久,方便开发人员调试。
      • 4、通过getViewerFrameStamp()得到记录了仿真循环运行的参考时间,总时间和总帧数的类osg::FrameStamp中的变量_frameStamp。所以你们需要获取这些信息的话,也可以通过读取这个变量的成员函数来实现。当然,使用 Viewer 中的 osg::Stats 变量_stats 也是可以的,缺省情况下,这个变量会忠 实地记录当前帧以及之前的 24 帧的每帧用时,事件遍历用时,更新遍历用时,以及渲染遍 历用时信息。如果我们想获得更多的历史数据,可以在开始仿真循环之前执行 ViewerBase::setStats 函数,重新设置这个记录器的参数,或不需要对于记录这些信息,简单地 将其置为 NULL。
      • 5、然后就是遍历所有的view,通过他们来得到当然场景的根节点root以及视图的状态信息stats。然后通过statsVisitor类来遍历场景中所有的节点信息,并区分他们按照osg中节点的类型来区分和统计他们的信息保存到stats中。
      • 6、再就是得到所有的scene,并且遍历他们,分别得到这个场景所管理的dataPager以及imagerPager类,向数据库线程发出信号,表示已为新帧开始更新,剔除和绘制。 注意,这是由应用程序调用的,这样当CPU忙于主渲染线程时,数据库寻呼机可以进入休眠状态。并且计算得到整个场景的bounding box。
      • 7、然后判断ViewerBase::_endDynamicDrawBlock是否已经结束所有的动态对象绘制操作,,并重置endDynamicDrawBlock。这里所谓的动态对象,指得是使用 Object::setDataVariance 设置为 DYNAMIC 的场景对象。
      • 8、阻塞渲染线程。

下一步就是进行cull操作。我们先休息一下,明天继续。

原文链接  http://www.3wwang.cn/blog/article.ftl?id=37

转载于:https://www.cnblogs.com/wang985850293/p/10509475.html


http://www.niftyadmin.cn/n/4556305.html

相关文章

c语言字符编码

其数码取值为0~9 以下各数是合法的十六进制整常数: 0X2A(十进制为42) 0XA0 (十进制为160) 0XFFFF (十进制为65535) 以下各数不是合法的十六进制整常数: 5A (无前缀0X) 0X3H (含有非十六进制数码) ||| /101是 ASCII码 和C165完全不一样C1/101是转义字符 C…

VF语言和C语言哪个好学呀

||| C语言好学 VF太简单了. ||| 当然是c语言了 ||| VF语言 侧重了解计算机和编程就学C.建议你学习C语言.要学习数据库的话学SQL就可以了 但是功能却少的多 ||| 看你要侧重哪个方面了.侧重数据库就学VF vf简单 但机器难理解 越易得编程 越高级的语言人越容易理解 c语言太抽象 ||…

谁能跟我编写一个程序(C语言)题目是编写一个函数计算sum(n)=1+2+3+。。。+n(ngt;=1)

s; if n<1 exitelse i1; s0; while(i<n} {ssi; i;}endif} n a s0; for (i1;i<n;i) si;return s;} ||| int i 0;int sum 0;for(i0;i<100;i){ sum sum i;} ||| mian(){int i sum(n));}int sum(int x){ int i n &n); printf("sum(%d)%d" 源程序如下…

C++Primer第五版——习题答案详解(六)

习题答案目录&#xff1a;https://www.cnblogs.com/Mered1th/p/10485695.html 第7章 类 练习7.1 class Sales_data { public:std::string isbn() const { return bookNo; }Sales_data& combine(const Sales_data&);private:std::string bookNo;unsigned units_sold;dou…

编写一个从三个数中找出最大值的函数。(C语言)

m:c; return m;} int b c));}int max (int a b max(a &c); printf("max%d" &b &a c; scanf("%d%d%d" b main(){ int a a:b; mm>c int c){ int m; ma>b

CSDN支持语法高亮的常用语言(Markdown使用之)

语言名关键字BashbashCoffeeScriptcoffeescriptCcppC#csCSScssDiffdiffHTTPhttpIniiniJavajavaJavaScriptjavascriptJSONjsonMakefilemakefileMarkdownmarkdownObjective-CobjectivecPerlperlPythonpythonRubyrubySQLsqlXMLxmlARM汇编armasmAVR汇编avrasmMIPS汇编mipsasmx86汇编…

b% C语言中u% x%都是什么意思

则printf("i%u %u 如输入&#xff1a;12.23 输出&#xff1a;12345%f是以浮点数输出 如输入12345 输出15%ld是以长整型输出 如输入015 输出15%0是以八进制输出 如输入15 如123AFB&#xff09;%d以十进制整数输出 如123afb&#xff09;%X是以十六进制输出&#xff08;字母大…

Redis 哈希槽

Redis 集群中内置了 16384 个哈希槽&#xff0c;当需要在 Redis 集群中放置一个 key-value时&#xff0c;redis 先对 key 使用 crc16 算法算出一个结果&#xff0c;然后把结果对 16384 求余数&#xff0c; 这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽&#xff0c;re…