|
本帖最后由 servicebbs 于 2013-8-7 14:53 编辑
问题是这样的,我有一个ive格式的模型文件,叫a.ive,文件里含有jpeg格式未压缩纹理信息。文件中的设置:
DataVariance STATIC
unRefImageDataAfterApply TRUE
现在我想把a.ive中的纹理导出为jpg文件,所以我写了下面的代码:- osg::ref_ptr<osgDB::ReaderWriter::Options> options = new osgDB::ReaderWriter::Options;
- options->setOptionString("OutputTextureFiles");
- osgDB::Registry::instance()->setOptions(options);
- osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("C:\\a.ive");
- osgDB::writeNodeFile(*model.get(), "C:\\b.OSG");
- mRoot->addChild(model);
复制代码 运行后模型显示正确,b.OSG能够导出,并且其中包含纹理文件(*.jpg)引用信息,但是C:\\images目录中没有纹理文件(*.jpg),查看输出信息,发现错误信息如下(多条):
然后我跟踪代码,发现osgDB_jpeg.dll插件加载没有问题,失败是因为相对路径的疸,在插件的ReaderWriterJPEG.cpp文件的函数:- virtual WriteResult writeImage(const osg::Image &img,const std::string& fileName, const osgDB::ReaderWriter::Options *options) const
- {
- std::string ext = osgDB::getFileExtension(fileName);
- if (!acceptsExtension(ext)) return WriteResult::FILE_NOT_HANDLED;
- osgDB::ofstream fout(fileName.c_str(), std::ios::out | std::ios::binary);
- if(!fout) return WriteResult::ERROR_IN_WRITING_FILE;
- return writeImage(img,fout,options);
- }
复制代码 其中fileName变量保存的是相对路径,如”images\xiaofangche08.jpg”,导致osgDB:fstream初始化失败。如果这里把fileName变量内容改为”C:\ges\xiaofangche08.jpg”并在C盘添加ges目录,则能够成功正确输出xiaofangche08.jpg文件,由此可判断就是因为相对目录引起的纹理输出失败。
同时,这个文件中的readImage函数中,就有把相对目录转为绝对路径的操作:
std::string fileName = osgDB::findDataFile( file, options );
而writeImage却没有,而且因为部署的原因,也不太可能直接把ive或osg文件中纹理引用变成绝对路径,
所以,请问一下,是我使用上的问题还是这里代码有些错误,谢谢。
|
|