查看: 2689|回复: 8

读入osg文件后保存无纹理

[复制链接]

该用户从未签到

发表于 2010-4-19 14:09:29 | 显示全部楼层 |阅读模式
使用readNodeFile读入文件,然后writeNodeFile为new.osg,但是这个new.osg没有纹理。我read之后遍历Drawables能获得Image,请问是什么原因啊?
我读入的是cow.osg这个文件

该用户从未签到

发表于 2010-4-19 14:18:14 | 显示全部楼层
但是这个new.osg没有纹理
您是如何确定的?使用osgviewer打开new.osg后没有显示?直接使用osgconv来进行转换是否可以成功?

该用户从未签到

 楼主| 发表于 2010-4-19 17:16:04 | 显示全部楼层
您是如何确定的?使用osgviewer打开new.osg后没有显示?直接使用osgconv来进行转换是否可以成功?
array 发表于 2010-4-19 14:18

我用osgviewer读取没有看到,然后看osg文件里面,也没有file语句,所以我确定是没有纹理的。
我的这个程序是通过qt界面上的按钮来打开或者保存osg文件的。
如果仅仅只是在控制台下面读取后保存,是可以生成纹理的。按钮对应的操作就是readNodeFile和writeNodeFile。
所以我想请问,我现在该怎样排查问题?

该用户从未签到

发表于 2010-4-19 19:16:09 | 显示全部楼层
.osg文件使用的是纹理的相对路径,,同时,请确定你的环境变量里是否设置使用Images/reflect.rgb~~~~或者读取.osg时使用绝对路径的,这时你需要得到得到纹理并写出到指定目录,这样新的.osg才能找到~~~~~

该用户从未签到

 楼主| 发表于 2010-4-20 10:12:55 | 显示全部楼层
.osg文件使用的是纹理的相对路径,,同时,请确定你的环境变量里是否设置使用Images/reflect.rgb~~~~或者读取.osg时使用绝对路径的,这时你需要得到得到纹理并写出到指定目录,这样新的.osg才能找到~~~~~
FlySky 发表于 2010-4-19 19:16

我在读入文件的时候写出了纹理文件,但是写的时候怎么样才能将这个纹理和new.osg联系起来呢?
  1. for (int i=0;i< geode.getNumDrawables();i++)
  2. {
  3.   osg::Texture2D* tex = new osg::Texture2D;
  4.   tex = dynamic_cast<osg::Texture2D*>(geode.getDrawable(i)->getStateSet()->getTextureAttribute(0, osg::StateAttribute::TEXTURE));
  5.   osg::Image* img = tex->getImage();
  6.   if(img)
  7.   {
  8.    osgDB::writeImageFile(*img,"tex.rgb");
  9.   }
复制代码

以上是我写纹理的代码。

该用户从未签到

发表于 2010-4-20 12:24:31 | 显示全部楼层
写的时候怎么样才能将这个纹理和new.osg联系起来呢
您需要检查的是:new.osg中是否还指定有Image对象?可以直接用文本编辑器打开.osg文件并搜索其中的Image字样,或者reflect.rgb字样。

如果不存在,那么说明写出的时候丢失了纹理信息,这可能是因为要写出的场景本身没能正常加载纹理,请尝试先观察要写出场景,然后再写出。不要readNodeFile之后直接writeNodeFile

该用户从未签到

 楼主| 发表于 2010-4-20 14:02:05 | 显示全部楼层
您需要检查的是:new.osg中是否还指定有Image对象?可以直接用文本编辑器打开.osg文件并搜索其中的Image字样,或者reflect.rgb字样。

如果不存在,那么说明写出的时候丢失了纹理信息,这可能是因为要写出的场景本 ...
array 发表于 2010-4-20 12:24

new.osg中不存在Image对象。以下是其中Texture2D的代码:
  1. Texture2D {
  2. DataVariance STATIC
  3. wrap_s REPEAT
  4. wrap_t REPEAT
  5. wrap_r REPEAT
  6. min_filter NEAREST_MIPMAP_LINEAR
  7. mag_filter LINEAR
  8. maxAnisotropy 1
  9. borderColor 0 0 0 0
  10. borderWidth 0
  11. useHardwareMipMapGeneration TRUE
  12. unRefImageDataAfterApply TRUE
  13. internalFormatMode USE_IMAGE_DATA_FORMAT
  14. resizeNonPowerOfTwo TRUE
  15. }
复制代码
按照您说的丢失了纹理信息,这个是在写的过程中丢失的,因为读取的时候我能看到纹理,并且也写了getImage的代码,是可以获得的。
请问接下来该怎么解决呢?

该用户从未签到

发表于 2010-4-20 14:23:07 | 显示全部楼层
根据现有的信息,抱歉我是无法判断了;也许您可以检查自己的文件读写插件是否可用,以及提供更多的信息。因为这种转换在我这里没有什么问题,无论采取什么工具

该用户从未签到

 楼主| 发表于 2010-4-23 15:34:52 | 显示全部楼层
根据现有的信息,抱歉我是无法判断了;也许您可以检查自己的文件读写插件是否可用,以及提供更多的信息。因为这种转换在我这里没有什么问题,无论采取什么工具
array 发表于 2010-4-20 14:23

直接使用writeNodeFile保存时候无纹理的原因我查不出来,不过现在通过间接的方法保存文件时候可以有纹理,现在发上来大家共享一下:
读取的时候将纹理文件获得并写出,在保存之前先setImage,再writeNodeFile即可。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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