查看: 1385|回复: 2

快速入门指导中<将文件名赋给Image对象并将Image关联到Texture2D即可>的问题

[复制链接]

该用户从未签到

发表于 2012-3-28 12:42:53 | 显示全部楼层 |阅读模式
本帖最后由 yangwenyong 于 2012-3-28 12:44 编辑

新手有问题请教各位老师

现象:
快速入门指导里边这样说:
如果要使用 2D 图像文件作为纹理映射的图形, 只要将文件名赋给 Image 对象并将 Image 关联到 Texture2D 即可.
下面的代码段 将文件 sun.tif 作为纹理映射的图形.
osg::StateSet* state = node->getOrCreateStateSet();
// 读取纹理图像.
osg::ref_ptr image = new osg::Image;
image->setFileName( "sun.tif" );

因为程序运行时内存占用大的问题,所以我按照上面所说的方法进行开发,但是纹理无法显示出来
用这个方法之前,我用osgDB::readImageFile()直接把图片读入进来后再关联到Texture2D ,是可以显示出来纹理的。

问题:
难道必须用osgDB::readImageFile()才能把纹理显示出来吗?
在这个阶段,用readImageFile读出图像的话,内存就会占用的很大。
同样的程序,我用另外一家商用的3d引擎做的话,该引擎只是用Texture->setFileName()关联上,最终就可以显示纹理了。
所以它内存耗用不大的,
用osg的话,因为用了osgDB::readImageFile(),所以内存耗用很大,我感觉内存消耗大的原因和纹理图像有很大的关系。
为什么osg用image->setFileName()关联不好使呢?是我使用的有问题吗?
怎么解决呢?

该用户从未签到

发表于 2012-3-29 09:52:19 | 显示全部楼层
    这个我觉得你的理解有些问题:

1 在OpenGL生成纹理的过程就是,解析图片,解析包装数据,然后上传到显存。
2  我这里没有源代码,你可以看看image->setFileName()函数,也许它仅仅是设置了一个string的名字,并没有调用真正的解析,而你的商业引擎的调用模式就是setFileName()以后,会自动调用诸如LoadImage()之类的函数。
3 耗内存的话,只能和纹理图片的大小有关,osg如果特别耗内存,我觉得也只是它没有释放内存中的颜色数据,最终的纹理数据都在显存,觉得应该没有差别的。

该用户从未签到

 楼主| 发表于 2012-3-29 21:54:38 | 显示全部楼层
谢谢,你说的从根本上来讲有道理,我再具体研究研究
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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