• 场景图形管理-多视图多窗口渲染示例(4)


            多视图多窗口渲染示例的代码如程序清单8-6所示

    1. // 多视图多窗口渲染示例
    2. void compositeViewer_8_6(const string &strDataFolder)
    3. {
    4. // 创建一个CompositeViewer对象
    5. osg::ref_ptr viewer = new osgViewer::CompositeViewer();
    6. // 创建两个视图
    7. osg::ref_ptr viewer1 = new osgViewer::View();
    8. osg::ref_ptr viewer2 = new osgViewer::View();
    9. int xoffset = 50;
    10. int yoffset = 200;
    11. // 视图1的节点
    12. string strDataPath = strDataFolder + "cessna.osg";
    13. osg::ref_ptr viewer1Node = osgDB::readNodeFile(strDataPath);
    14. // 视图2的节点
    15. strDataPath = strDataFolder + "cow.osg";
    16. osg::ref_ptr viewer2Node = osgDB::readNodeFile(strDataPath);
    17. // 优化产经数据
    18. osgUtil::Optimizer optimizer;
    19. optimizer.optimize(viewer1Node.get());
    20. optimizer.optimize(viewer2Node.get());
    21. // 视图窗口1
    22. {
    23. // 设置图形环境特性
    24. osg::ref_ptr traits = new osg::GraphicsContext::Traits();
    25. traits->x = xoffset + 0;
    26. traits->y = yoffset + 0;
    27. traits->width = 600;
    28. traits->height = 480;
    29. traits->windowDecoration = true;
    30. traits->doubleBuffer = true;
    31. traits->sharedContext = 0;
    32. // 绘制图形环境
    33. osg::ref_ptrgc = osg::GraphicsContext::createGraphicsContext(traits.get());
    34. // 创建相机
    35. osg::ref_ptr camera1 = viewer1->getCamera();
    36. // 设置图形环境
    37. camera1->setGraphicsContext(gc.get());
    38. // 设置视口
    39. camera1->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));
    40. // 设置缓冲
    41. GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
    42. camera1->setDrawBuffer(buffer);
    43. camera1->setReadBuffer(buffer);
    44. // 设置场景数据
    45. viewer1->setSceneData(viewer1Node.get());
    46. }
    47. // 视图窗口2
    48. {
    49. // 设置图形环境特性
    50. osg::ref_ptr traits = new osg::GraphicsContext::Traits();
    51. traits->x = xoffset + 600;
    52. traits->y = yoffset + 0;
    53. traits->width = 600;
    54. traits->height = 480;
    55. traits->windowDecoration = true;
    56. traits->doubleBuffer = true;
    57. traits->sharedContext = 0;
    58. // 绘制图形环境
    59. osg::ref_ptrgc = osg::GraphicsContext::createGraphicsContext(traits.get());
    60. // 创建相机
    61. osg::ref_ptr camera2 = viewer2->getCamera();
    62. // 设置图形环境
    63. camera2->setGraphicsContext(gc.get());
    64. // 设置视口
    65. camera2->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));
    66. // 设置缓冲
    67. GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
    68. camera2->setDrawBuffer(buffer);
    69. camera2->setReadBuffer(buffer);
    70. // 设置场景数据
    71. viewer2->setSceneData(viewer2Node.get());
    72. }
    73. // 添加视图
    74. viewer->addView(viewer1.get());
    75. viewer->addView(viewer2.get());
    76. viewer->realize();
    77. viewer->run();
    78. }

            截图如图8-15所示。

    图8-15多视图多窗口渲染示例图

  • 相关阅读:
    SynCoBERT:语法引导的多模态对比预训练用于代码表示。
    教程 | 使用 Apache SeaTunnel 同步本地文件到阿里云 OSS
    第4章 请求与响应
    通过ffmpeg 下载在线的.m3u8格式视频
    【Newman+Jenkins】实施接口自动化测试
    南卡和小米蓝牙耳机哪个更值得入手?南卡和小米蓝牙耳机深度测评
    互联网上做副业,要如何开启第一步?
    使用python对比两个json文件的不同并输出
    golang实现正向代理和反向代理
    【软考学习5】流水线基本概念、周期执行时间、吞吐率、加速比和效率的计算
  • 原文地址:https://blog.csdn.net/liangfei868/article/details/134439123