查看: 1683|回复: 3

在更新回调中实现动态渲染

[复制链接]

该用户从未签到

发表于 2010-3-15 10:30:59 | 显示全部楼层 |阅读模式
//问题,运行结果似乎只调用seed[0]的值,不能实现纹理图片信息的动态显示


void delay(int second)
{
time_t start_time, cur_time; // 变量声明
    time(&start_time);
    do { time(&cur_time);
       } while((cur_time - start_time) < second );
}
short seed[]={10,50,100,150,200,255};
//节点回调函数,更新节点的纹理
class CCubeTex : public osg::NodeCallback
{
public:
CCubeTex():index(0) {}
virtual void operator()(osg::Node* node,osg::NodeVisitor* nv)
{
  osg::ref_ptr<osg::Image> image=new osg::Image();
  unsigned char* imageBf=NULL;
  image=node->getStateSet()->getTextureAttribute(0,osg::StateAttribute::TEXTURE)
   ->asTexture()->getImage(0);
  imageBf=image->data();
  delay(1);  //做一秒的延时
  int i=0;
  for(i=0; i<image->getImageSizeInBytes();i++)
  {
   //imageBf[i]=(unsigned char)rand()%256;
   imageBf[i]=seed[index];
  }
  traverse(node,nv);
  
  std::cout<<i<<std::endl
   <<index<<std::endl
   <<(int)imageBf[index]<<std::endl
   <<seed[index]<<std::endl;
  index++;
  if(index>5) index=0;
}
protected:
short index;
};
void main()
{
osgViewer::Viewer viewer;
osg::ref_ptr<osg::Node> cube=new osg::Node();
cube=osgDB::readNodeFile("simple.osg");
//设置纹理坐标
osg::ref_ptr<osg::Vec2Array> tc = new osg::Vec2Array;
     tc->push_back( osg::Vec2( 0.f, 0.f ) );
     tc->push_back( osg::Vec2( 1.f, 0.f ) );
     tc->push_back( osg::Vec2( 1.f, 1.f ) );
     tc->push_back( osg::Vec2( 0.f, 1.f ) );
     cube->asGeode()->getDrawable(0)->asGeometry()->setTexCoordArray(0,tc.get());
osg::ref_ptr<osg::Image> imCube=new osg::Image();
imCube=osgDB::readImageFile("e://fly//xyy.png");
osg::ref_ptr<osg::Texture2D> txCube=new osg::Texture2D();
txCube->setDataVariance(osg::Object:YNAMIC);
txCube->setImage(imCube);
//节点上关联纹理
osg::ref_ptr<osg::StateSet> ssCube= new osg::StateSet();
ssCube->setTextureAttributeAndModes(0,txCube,osg::StateAttribute::ON);
cube->setStateSet(ssCube);
//节点关联更新回调
cube->setUpdateCallback(new CCubeTex);
viewer.setSceneData(cube);
viewer.realize();
viewer.run();/*
while(!viewer.done())
{
  viewer.frame();
}*/
}

该用户从未签到

 楼主| 发表于 2010-3-15 10:33:14 | 显示全部楼层
对于渲染状态的更新回调机制似乎还没有搞明白,求救!

该用户从未签到

发表于 2010-3-15 12:26:38 | 显示全部楼层
  1. delay(1);  //做一秒的延时
复制代码
无论您要做什么,这种延时都是相当疯狂的行为。

此外,如果您打算在回调中实时更新图片的内容,那么需要在更新完成后执行一次image->dirty()。例子osgprerender中有一个相关的应用

该用户从未签到

 楼主| 发表于 2010-3-15 13:54:06 | 显示全部楼层
delay(1);  //做一秒的延时
刚开始我是想可能执行太快了看不出来,就延时了一下。。
多谢array的指导!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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