当前位置:   article > 正文

OSG学习:场景图形管理(三)——多视图相机渲染_osg中两个viewer 是否可以使用同一个uniform量

osg中两个viewer 是否可以使用同一个uniform量

以下内容来自: 

1、《OpenSceneGraph三维渲染引擎编程指南》肖鹏 刘更代 徐明亮 清华大学出版社 

2、《OpenSceneGraph三维渲染引擎设计与实践》王锐 钱学雷 清华大学出版社

3、自己的总结

下载完整工程OSG_18_MultipleViewCameras

创建C++项目后,首先需要配置OSG环境,具体步骤看OSG学习:WIN10系统下OSG+VS2017编译及运行第六步:新建OSG项目测试。

 

  1. // stdafx.h
  2. #include <osg/Node>
  3. #include <osg/Geode>
  4. #include <osg/Geometry>
  5. #include <osg/Group>
  6. #include <osg/MatrixTransform> //移动节点的矩阵类,最常用的移动节点的类。可随动、旋转控制节点
  7. #include <osg/PositionAttitudeTransform> //位置变换节点类,提供模型的位置变换、大小缩放、原点位置的设置、坐标系的变换
  8. #include <osg/Camera> //相机节点,管理OSG中的模型——视图矩阵,相机的管理主要是通过各种变换实现的
  9. #include <osgGA/TrackballManipulator>
  10. #include <osgDB/ReadFile>
  11. #include <osgDB/WriteFile>
  12. #include <osgUtil/Optimizer>
  13. #include <osgViewer/Viewer>
  14. #include <osgViewer/ViewerEventHandlers> //事件监听
  15. #include <osgViewer/CompositeViewer>
  1. //.cpp
  2. /*
  3. *多视图相机渲染
  4. *
  5. *在OSG中,多视图的管理是通过osgViewer::CompositeViewer来实现的,它负责多个视图的管理及同步工作,继承自osgViewer::ViewerBase类
  6. *
  7. *视图的创建:
  8. *设置图形环境特性
  9. *创建图形环境特性
  10. *创建视图
  11. *设置视图场景数据
  12. *(根据分辨率确定合适的投影来保证显示的图形不变形)
  13. *设置相机视口及图形环境
  14. *设置操作器
  15. *(添加事件处理)
  16. */
  17. osg::ref_ptr<osg::GraphicsContext> CreateGraphicsContext(osg::ref_ptr<osg::GraphicsContext::Traits> traits)
  18. {
  19. //设置图形环境特性
  20. //osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits();
  21. traits->x = 100;
  22. traits->y = 100;
  23. traits->width = 900;
  24. traits->height = 700;
  25. traits->windowDecoration = true;
  26. traits->doubleBuffer = true;
  27. traits->sharedContext = 0;
  28. //创建图形环境特性
  29. osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
  30. if (gc->valid())
  31. {
  32. osg::notify(osg::INFO) << "GraphicsWindow has been created successfully." << std::endl;
  33. //清除窗口颜色及颜色和深度缓冲
  34. gc->setClearColor(osg::Vec4f(0.2f, 0.2f, 1.6f, 1.0f));
  35. gc->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  36. }
  37. else
  38. {
  39. osg::notify(osg::NOTICE) << "GraphicsWindow has not been created successfully." << std::endl;
  40. }
  41. return gc.get();
  42. }
  43. //视图一
  44. void View1(osg::ref_ptr<osgViewer::CompositeViewer> viewer, osg::ref_ptr<osg::Node> node, osg::ref_ptr<osg::GraphicsContext::Traits> traits, osg::ref_ptr<osg::GraphicsContext> gc)
  45. {
  46. //创建视图一
  47. osg::ref_ptr<osgViewer::View> view = new osgViewer::View();
  48. viewer->addView(view.get());
  49. //设置视图场景数据
  50. view->setSceneData(node.get());
  51. //设置相机视口及图形环境
  52. view->getCamera()->setViewport(new osg::Viewport(0, 0, traits->width / 2, traits->height / 2));
  53. view->getCamera()->setGraphicsContext(gc.get());
  54. //设置操作器
  55. view->setCameraManipulator(new osgGA::TrackballManipulator);
  56. //添加事件处理
  57. view->addEventHandler(new osgViewer::StatsHandler);
  58. view->addEventHandler(new osgViewer::WindowSizeHandler);
  59. view->addEventHandler(new osgViewer::ThreadingHandler);
  60. view->addEventHandler(new osgViewer::RecordCameraPathHandler);
  61. }
  62. //视图二
  63. void View2(osg::ref_ptr<osgViewer::CompositeViewer> viewer, osg::ref_ptr<osg::Node> node, osg::ref_ptr<osg::GraphicsContext::Traits> traits, osg::ref_ptr<osg::GraphicsContext> gc)
  64. {
  65. //创建视图二
  66. osg::ref_ptr<osgViewer::View> view = new osgViewer::View();
  67. viewer->addView(view.get());
  68. //设置视图场景数据
  69. view->setSceneData(node.get());
  70. //设置相机视口及图形环境
  71. view->getCamera()->setViewport(new osg::Viewport(traits->width / 2, 0, traits->width / 2, traits->height / 2));
  72. view->getCamera()->setGraphicsContext(gc.get());
  73. //设置操作器
  74. view->setCameraManipulator(new osgGA::TrackballManipulator);
  75. }
  76. //视图三
  77. void View3(osg::ref_ptr<osgViewer::CompositeViewer> viewer, osg::ref_ptr<osg::Node> node, osg::ref_ptr<osg::GraphicsContext::Traits> traits, osg::ref_ptr<osg::GraphicsContext> gc)
  78. {
  79. //创建视图三
  80. osg::ref_ptr<osgViewer::View> view = new osgViewer::View();
  81. viewer->addView(view.get());
  82. //设置视图场景数据
  83. view->setSceneData(node.get());
  84. //根据分辨率确定合适的投影来保证显示的图形不变形
  85. double fovy, aspectRatio, zNear, zFar;
  86. view->getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio, zNear, zFar);
  87. double newAspectRatio = double(traits->width) / double(traits->height / 2);
  88. double aspectRatioChange = newAspectRatio / aspectRatio;
  89. if (aspectRatioChange != 1.0)
  90. {
  91. view->getCamera()->getProjectionMatrix() *= osg::Matrix::scale(1.0 / aspectRatioChange, 1.0, 1.0);
  92. }
  93. //设置相机视口及图形环境
  94. view->getCamera()->setViewport(new osg::Viewport(0, traits->height / 2, traits->width / 2, traits->height / 2));
  95. view->getCamera()->setGraphicsContext(gc.get());
  96. //设置操作器
  97. view->setCameraManipulator(new osgGA::TrackballManipulator);
  98. }
  99. int main()
  100. {
  101. //读取模型
  102. osg::ref_ptr<osg::Node> cow = osgDB::readNodeFile("cow.osg");
  103. osg::ref_ptr<osg::Node> cessna = osgDB::readNodeFile("cessna.osg");
  104. //优化场景数据
  105. osgUtil::Optimizer optimizer;
  106. optimizer.optimize(cow.get());
  107. optimizer.optimize(cessna.get());
  108. //设置并创建图形环境
  109. osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits();
  110. osg::ref_ptr<osg::GraphicsContext> gc = CreateGraphicsContext(traits);
  111. //创建CompositeViewer对象
  112. osg::ref_ptr<osgViewer::CompositeViewer> viewer = new osgViewer::CompositeViewer();
  113. View1(viewer, cow.get(), traits.get(), gc.get());
  114. View2(viewer, cessna.get(), traits.get(), gc.get());
  115. View3(viewer, cessna.get(), traits.get(), gc.get());
  116. viewer->realize();
  117. return viewer->run();
  118. }

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/314897
推荐阅读
相关标签
  

闽ICP备14008679号