查看: 1521|回复: 2

关于相机渲染的先后顺序

[复制链接]

该用户从未签到

发表于 2014-6-27 22:24:33 | 显示全部楼层 |阅读模式
这里做了一个测试,主要是想看一看,相机渲染先后顺序,代码如下,定义了
两个相机,相机ca用的是PRE_RENDER,相机cm用的是POST_RENDER,然后分别定义了
两个相机PostDrawCallback,在ca相机的回调函数中演示了1s,然后看相机的渲染
先后情况,相应的输出结果如下所示。有人能够解释一下,输出这种结果的原因吗?
1.打印结果的先后顺序,为什么是这样?
  1. class CameraPostDraw:public osg::Camera::DrawCallback
  2. {
  3. public:
  4.        
  5.         CameraPostDraw()
  6.         {}
  7.                
  8.         virtual void         operator() (const osg::Camera & camera) const
  9.         {
  10.                 std::cout<< "camera 1 callback"<<std::endl;
  11.                 Sleep(1000);

  12.         }
  13. };
复制代码

  1. class CameraPostDraw2:public osg::Camera::DrawCallback
  2. {
  3. public:
  4.        
  5.         CameraPostDraw2()
  6.         {
  7.                
  8.         }
  9.        
  10.         virtual void operator()  ( osg::RenderInfo &  renderInfo   )  const
  11.         {
  12.                 std::cout<< "camera 2 callback"<<std::endl;
  13.         }
  14.        
  15. };
复制代码

  1. osgViewer::CompositeViewer cview;
  2.         osgViewer::Viewer *view=new osgViewer::Viewer;
  3.         Camera *ca=view->getCamera();
  4.         ca->setViewport(0,0,400,300);
  5.         ca->setViewMatrixAsLookAt(Vec3(0,50,200),Vec3(0,0,0),Vec3(0,0,1));
  6.         ca->setProjectionMatrixAsPerspective(30,1.3,1,1000);
  7.         ca->setGraphicsContext(gc);
  8.         ca->setRenderOrder(osg::Camera::PRE_RENDER);
  9.         ca->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  10.         view->setSceneData(tnode);

  11.         ca->setPostDrawCallback(new CameraPostDraw());

  12.         osgViewer::Viewer *vw=new osgViewer::Viewer;
  13.         //vw->setUpViewInWindow(400,400,400,400);
  14.         osg::Camera *cm=vw->getCamera();
  15.         cm->setViewport(400,300,400,300);
  16.         cm->setProjectionMatrixAsPerspective(30,1.3,1,1000);
  17.         cm->setViewMatrixAsLookAt(Vec3(0,-100,300),Vec3(0,0,0),Vec3(0,0,1));
  18.         cm->setGraphicsContext(gc);
  19.         cm->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  20.         cm->setRenderOrder(osg::Camera::POST_RENDER);
  21.         vw->setSceneData(gnode);
  22.         cm->setPostDrawCallback(new CameraPostDraw2());

  23.         cview.addView(view);
  24.         cview.addView(vw);

  25.         while(!cview.done())
  26.         {
  27.                 std::cout<<"main fucntion 1"<<std::endl;
  28.                 cview.frame();
  29.                 std::cout<<"main fucntion 2"<<std::endl;
  30.         }
复制代码

该用户从未签到

发表于 2014-7-1 08:30:07 | 显示全部楼层
您是否忽略了多线程渲染的影响?请使用setTheadingModel设置为单线程再做实验
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表