查看: 1929|回复: 2

连续更新Skybox贴图

[复制链接]

该用户从未签到

发表于 2012-12-24 16:26:07 | 显示全部楼层 |阅读模式
1.新建6个osg::Image
  1. for(unsigned int i = 0; i < 6; i++)
  2.         {
  3.                 image_data[i] = new unsigned char[512*512*3];
  4.                 cube_surface[i] = new osg::Image;
  5.                 cube_surface[i]->setImage(512,512,
  6.                         1,GL_LINE_STRIP,GL_BGR,GL_UNSIGNED_BYTE,(BYTE*)image_data[i],
  7.                         osg::Image::AllocationMode::USE_NEW_DELETE);
  8.         }
复制代码
2.初始化Skybox的cubemap
  1. void SkyBox::setEnvironmentMap( unsigned int unit, osg::Image* posX, osg::Image* negX,
  2.         osg::Image* posY, osg::Image* negY, osg::Image* posZ, osg::Image* negZ )
  3. {
  4.         if ( posX && posY && posZ && negX && negY && negZ )
  5.         {
  6.                 osg::ref_ptr<osg::TextureCubeMap> cubemap = new osg::TextureCubeMap;
  7.                 cubemap->setImage( osg::TextureCubeMap::POSITIVE_X, posX );
  8.                 cubemap->setImage( osg::TextureCubeMap::NEGATIVE_X, negX );
  9.                 cubemap->setImage( osg::TextureCubeMap::POSITIVE_Y, posY );
  10.                 cubemap->setImage( osg::TextureCubeMap::NEGATIVE_Y, negY );
  11.                 cubemap->setImage( osg::TextureCubeMap::POSITIVE_Z, posZ );
  12.                 cubemap->setImage( osg::TextureCubeMap::NEGATIVE_Z, negZ );

  13.                 cubemap->setWrap( osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE );
  14.                 cubemap->setWrap( osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE );
  15.                 cubemap->setWrap( osg::Texture::WRAP_R, osg::Texture::CLAMP_TO_EDGE );
  16.                 cubemap->setFilter( osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR );
  17.                 cubemap->setFilter( osg::Texture::MAG_FILTER, osg::Texture::LINEAR );
  18.                 cubemap->setResizeNonPowerOfTwoHint( false );
  19.                 getOrCreateStateSet()->setTextureAttributeAndModes( unit, cubemap.get() );
  20.         }
  21. }
复制代码
3.在计时器函数OnTimer中,动态地改变每个osg::Image的数据
  1. for (unsigned int f = 0; f < 6; f++)
  2.         {
  3.                 m_camera.getCubeMap(&cube_image,f);
  4.        
  5.                 memcpy(image_data[f],cube_image.pData,512*512*3);
  6.         }
复制代码
可是,什么也没有显示,如下图:
QQ截图20121224161824.png
是灰色的。我估计是新建时候的数据。
但是我调试发现memcpy()函数之后原始的Image确实改变了。
也就是说,cubemap没有及时更新。
那么,问题就是怎么让cubemap动态地更新图像。

该用户从未签到

发表于 2012-12-24 16:44:51 | 显示全部楼层
dirty

该用户从未签到

 楼主| 发表于 2012-12-24 16:54:12 | 显示全部楼层
liuzhiyu123 发表于 2012-12-24 16:44
dirty

谢谢您。
一字千金啊。
也充分说明我太水了。
计时器函数中改为:
  1. for (unsigned int f = 0; f < 6; f++)
  2.         {
  3.                 m_camera.getCubeMap(&cube_image,f);
  4.        
  5.                 memcpy(image_data[f],cube_image.pData,512*512*3);
  6.                
  7.                 cube_surface[f]->dirty();
  8.         }
复制代码
问题解决。!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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