测试读取osgt和osgb格式时,发现没有纹理,手动指定一张图片却可以。
原因1
在读取osgt和osgb格式文件时,崩溃,发现是读取jpeg出问题了,调用函数时会崩溃。
编的的动态库,改编成静态库就正常了。
原因2
跟踪调试发现是osg在反序列化时,将Texture2D,Material等(继承自类StateAttribute)动态转型为StateAttribute失败:
源码在osgDB::InputStream中167行这个模板函数:
template<typename T>
T* readObjectOfType()
{
osg::ref_ptr<osg::Object> obj = readObject();
T* ptr = dynamic_cast<T*>(obj.get());
if (ptr) { obj.release(); return ptr; }
else return 0;
}
这个函数是将最基类转为中间基类(而不是转为实际指向的子类)失败!奇怪的是同样反序列化将osg::Geometry转为osg::Drawable成功了,在Windows下面是没问题的。
目前原因未知:将这个函数更改如下即可:
template<typename T>
T* readObjectOfType()
{
osg::ref_ptr<osg::Object> obj = readObject();
T* ptr = dynamic_cast<T*>(obj.get());
if(!ptr)
ptr = reinterpret_cast<T*>(obj.get());
if (ptr) { obj.release(); return ptr; }
else return 0;
}
即如果转型失败将强制转型。不过讲道理这个转换是不应该失败的,可能是Android下面编译器哪里规范不一样,以后有时间再排查。
更改之后osgb倾斜摄影格式文件正确加载!