查看: 1416|回复: 9

请大家帮忙看下,同样的两个RTT,显示同一个模型时,只能显示第一个。

[复制链接]

该用户从未签到

发表于 2014-5-14 11:30:34 | 显示全部楼层 |阅读模式
请大家帮忙看下,同样的两个RTT,显示同一个模型时,只能显示第一个,第二个不能正确显示(只是一片蓝)。而两个显示不同的模型时则都能显示。

class  TextureVisitor : public osg::NodeVisitor
{
public:
        TextureVisitor():
          osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
          {
                   tex2D =NULL ;
          }
          virtual void apply(osg::Node& node)
          {
                  if(node.getStateSet())
                  {
                          apply(node.getStateSet());
                  }
                  traverse(node);
          }
          virtual  void apply(osg::Geode& geode)
          {
                  if(geode.getStateSet())
                  {
                          apply(geode.getStateSet());
                  }
                  unsigned  int cnt = geode.getNumDrawables();
                  for(unsigned int i =0;i<cnt ;i++)
                  {
                          apply(geode.getDrawable(i)->getStateSet());
                  }
                  traverse(geode);
          }
          void apply(osg::StateSet* state)
          {
                  osg::StateSet::TextureAttributeList& texAttribList =
                          state->getTextureAttributeList();
                        tex2D =dynamic_cast<osg::Texture2D*>(state->getTextureAttribute(0,osg::StateAttribute::TEXTURE));
                  }
          }
          std::map<std::string ,osg::Image*>& getImage(void)
          {
                  return _imageList;
          }
          osg::Texture2D* getTexture2D(void)
          {
                  return tex2D;
          }
protected:
        std::map<std::string ,osg::Image*>  _imageList;
         osg::Texture2D*  tex2D ;
};
osg::ref_ptr<osg::Camera> camera[10]  ;
osg::Camera* createRttCamera0(const osg::BoundingSphere& bs)
{
          camera[0] =new osg::Camera;
        camera[0]->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        camera[0]->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
        camera[0]->setViewport(0,0,256,256);
        camera[0]->setRenderOrder(osg::Camera:RE_RENDER);
        camera[0]->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);

        double viewDistance =2.0* bs.radius();
        double znear =viewDistance -bs.radius();
        double zfar =viewDistance + bs.radius();
        float top =0.6 *znear ;
        float right =0.8* znear;
        camera[0]->setProjectionMatrixAsFrustum(-right,right,-top,top,znear,zfar);
        osg::Vec3d upDirection(0.0,0.0,1.0);
        osg::Vec3d viewDirection(0.0,-1.0,0.0);
        osg::Vec3d center =bs.center();
        osg::Vec3d eyePoint =center +viewDirection * viewDistance ;
        camera[0]->setViewMatrixAsLookAt(eyePoint ,center ,upDirection);
        return camera[0].release();
}
osg::Camera* createRttCamera1(const osg::BoundingSphere& bs)
{
          camera[1] =new osg::Camera;
        camera[1]->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        camera[1]->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
        camera[1]->setViewport(0,0,256,256);
        camera[1]->setRenderOrder(osg::Camera::PRE_RENDER);
        camera[1]->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
        double viewDistance =2.0* bs.radius();
        double znear =viewDistance -bs.radius();
        double zfar =viewDistance + bs.radius();
        float top =0.6 *znear ;
        float right =0.8* znear;
        camera[1]->setProjectionMatrixAsFrustum(-right,right,-top,top,znear,zfar);
        osg::Vec3d upDirection(0.0,0.0,1.0);
        osg::Vec3d viewDirection(0.0,-1.0,0.0);
        osg::Vec3d center =bs.center();
        osg::Vec3d eyePoint =center +viewDirection * viewDistance ;
        camera[1]->setViewMatrixAsLookAt(eyePoint ,center ,upDirection);
        return camera[1].release();
}
int main()
{
        osgViewer::Viewer* viewer =new osgViewer::Viewer();
        osg::Group* root =new osg::Group();
        osg::Node* node =new osg::Node();
        node =osgDB::readNodeFile("aa.ive");//我自己的模型,RTT相机纹理帖子该模型的两块地方。
        TextureVisitor textureTV1;
        node->asGroup()->getChild(0)->accept(textureTV1);
        TextureVisitor textureTV2;
        node->asGroup()->getChild(1)->accept(textureTV2);
        osg::Texture2D* texture1 = dynamic_cast<osg::Texture2D*>(textureTV1.getTexture2D());
        osg::Texture2D* texture2 = dynamic_cast<osg::Texture2D*>(textureTV2.getTexture2D());
        osg::Node* cownode1 =osgDB::readNodeFile("cow.osg");//如果再定义个节点,读取飞机模型,然后给camera[1]。则两个RTT都能正确显示。
        cownode1->getOrCreateStateSet()->setMode(GL_LIGHTING ,osg::StateAttribute::OFF);
        camera[0]=createRttCamera0(cownode1->getBound());
        camera[1] =createRttCamera1(cownode1->getBound());
        camera[0]->addChild(cownode1);
        camera[0]->attach(osg::Camera::COLOR_BUFFER ,texture1);
        camera[1]->addChild(cownode1);
        camera[1]->attach(osg::Camera::COLOR_BUFFER ,texture2);
        root->addChild(camera[0]);
        root->addChild(camera[1]);
        root->addChild(node);
        osgUtil::Optimizer optimizer;
        optimizer.optimize(root);
        viewer->setSceneData(root);

        viewer->realize();
        viewer->run();
        return 0;
}

该用户从未签到

发表于 2014-5-14 12:01:01 | 显示全部楼层
既然不能共享一个对象,为啥不创建两个对象
osg::Node* cownode1 =osgDB::readNodeFile("cow.osg");
osg::Node* cownode2 =osgDB::readNodeFile("cow.osg");

该用户从未签到

 楼主| 发表于 2014-5-14 17:48:22 | 显示全部楼层
cenfer 发表于 2014-5-14 12:01
既然不能共享一个对象,为啥不创建两个对象
osg::Node* cownode1 =osgDB::readNodeFile("cow.osg");
osg: ...

那如果一个汽车的两个后视镜用RTT来做,还要创建两个场景对象吗?

该用户从未签到

发表于 2014-5-14 19:36:57 | 显示全部楼层
那用一个RTT获得一个Image  贴两个后视镜

该用户从未签到

 楼主| 发表于 2014-5-15 11:26:32 | 显示全部楼层
cenfer 发表于 2014-5-14 19:36
那用一个RTT获得一个Image  贴两个后视镜

请问你确定OSG里面RTT只能这么单用吗?不能渲染同一个场景?

该用户从未签到

发表于 2014-5-15 12:03:17 | 显示全部楼层
不确定,根据你的测试是这样的。

该用户从未签到

发表于 2014-5-16 22:41:10 | 显示全部楼层
rtt camera是可以无限多个一起使用的,您的程序中我唯一无法判断的是写入的texture对象为什么是来自模型中的。一般来说它应该是新建的Texture实例以确保能够分配对应的空间

该用户从未签到

 楼主| 发表于 2014-5-18 10:53:34 | 显示全部楼层
array 发表于 2014-5-16 22:41
rtt camera是可以无限多个一起使用的,您的程序中我唯一无法判断的是写入的texture对象为什么是来自模型中 ...

谢谢您的解答。我按新建texture方法再试试看。来自模型texture对象是为了直接把模型的两个面直接替换成RTT的。

该用户从未签到

发表于 2015-7-10 17:03:13 | 显示全部楼层
楼主最终新建texture方法成功了么 求分享

该用户从未签到

发表于 2015-7-13 09:37:03 | 显示全部楼层
这个我最近也在看RTT的东西,既然楼主都说了,可以贴不同的纹理上去,那写入的texture对象来自模型这里是可以正确获得texture对象的。问题是不是出在当使用同一个模型的时候,两个RTT相机是一模一样的,其实我也是猜的。RTT的后端渲染在哪里,会不会有冲突之类的,坐等楼主给出实验结果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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