查看: 8758|回复: 22

构建的模型和纹理保存为osgb格式,纹理如何压缩?

[复制链接]

该用户从未签到

发表于 2014-7-1 18:29:11 | 显示全部楼层 |阅读模式
通过自己创建的数据构建模型,读取jpg格式的数据作为纹理,进行状态渲染,保存为osgb格式的文件,发现保存的数据大于模型数据+jpg的纹理数据大小之和,请问群里大神如何进行纹理压缩,保存后的数据较小?

该用户从未签到

发表于 2015-12-26 12:31:43 | 显示全部楼层
问题解决了没有?我能明白你的意思,就是需要和原来的osgb一样,使用内部纹理压缩模式

该用户从未签到

发表于 2014-7-7 06:45:40 | 显示全部楼层
你的压缩的意思是要保存的模型,占硬盘空间上比较小吗, 还是希望渲染的效果比较快?
     如果是压缩纹理的话,可以把纹理压缩为dds格式(首先要是2的幂次),这种格式在GPU中可以直接支持和渲染,不需要解压缩,这样在显存中的空间比较小。

该用户从未签到

 楼主| 发表于 2014-7-8 15:56:57 | 显示全部楼层
首先,先谢谢您,可能我没有表述清楚我的问题。
是这样子的,我有一个osg的模型数据(不含纹理),一个其链接的纹理数据(.jpg),读入后保存为osgb格式(纹理和模型在一起的,用二进制的方式存储的),保存后的数据的大小比osg模型数据+.jpg纹理的总和还要大好几倍,甚至几十倍.请问我需要如何压缩一下,使ogsb的数据比二者之和小呢?因为我的osg数据和纹理数据是通过osgconv转化出来的,原始的osgb数据是包含osg模型和纹理数据的,该数据是小于二者之和的。暂时不考虑渲染效率问题,请问怎么处理?

该用户从未签到

发表于 2014-7-8 17:37:35 | 显示全部楼层
depth 发表于 2014-7-8 15:56
首先,先谢谢您,可能我没有表述清楚我的问题。
是这样子的,我有一个osg的模型数据(不含纹理),一个其 ...

因为我的osg数据和纹理数据是通过osgconv转化出来的,……不知道你转换成什么格式了,你可以再试一次,转换成ive格式,应该能达到你的要求。
(如果你的转换后的文件为a.osg,则可以运行---cmd下输入osgConv --compressed a.osg  x:\\test.ive。然后去X盘找到test.ive文件,看一下大小,应该变小了很多。)

该用户从未签到

 楼主| 发表于 2014-7-11 21:11:48 | 显示全部楼层
StarShine 发表于 2014-7-8 17:37
因为我的osg数据和纹理数据是通过osgconv转化出来的,……不知道你转换成什么格式了,你可以再试一次,转 ...

osgb数据(含纹理+模型,约94k),通过osgconv分开为模型数据(osg格式,约64k)和纹理数据(jpg格式,约45k)。然后读入模型数据(osg格式,约64k)和纹理数据(jpg格式,约45k),当然纹理是自动连接的,修改纹理的链接模式为NO_REFERENCE,另存为osgb格式的数据(纹理+模型)后,该数据特别大,约有1.3M,请问是啥原因呢,有没有压缩的可能性呢?输出的格式要求为osgb(纹理+模型)的,所以暂时不考虑保存为ive的。

该用户从未签到

发表于 2014-7-12 00:19:49 | 显示全部楼层
depth 发表于 2014-7-11 21:11
osgb数据(含纹理+模型,约94k),通过osgconv分开为模型数据(osg格式,约64k)和纹理数据(jpg格式,约 ...

jpg本身就是压缩格式,而且不被显卡支持,读到内存里必须先解压才能显示,保存为osgb默认情况下不会对解压的纹理再进行压缩,所以体积就大了。可以修改保存选项,保存时候对纹理进行无损压缩,osgb文件会小一些,但应该还是比有损的jpg+模型文件要大。要是将数据和纹理分开保存,那就随便保存成什么格式了,只要osg支持就可以,但是下次读取的时候还要解压,读取会慢。

该用户从未签到

 楼主| 发表于 2014-7-12 16:47:20 | 显示全部楼层
smash 发表于 2014-7-12 00:19
jpg本身就是压缩格式,而且不被显卡支持,读到内存里必须先解压才能显示,保存为osgb默认情况下不会对解 ...

我的数据是osgb格式(纹理+模型),属性UnRefImageDataAfterApply=true,读入后writeNodeFile,保存的格式自动为模型(osgb)+纹理(.jpg),我写了个访问器,通过修改纹理的链接方式为NO_REFERENCE后(默认是外部链接,记不清名称了, ),能保存为osgb(纹理+模型一起)的,但是数据量大,请问:1.为什么原始的osgb格式的数据量小,我修改了一下,数据量就这么大? 2. 为什么读入后,直接writeNodeFile,存储的格式会和原始的不一样呢?谢谢。

该用户从未签到

发表于 2014-7-12 23:29:54 | 显示全部楼层
1.估计是原来多个Geode节点共用一些纹理数据,你设置成NO_REFERENCE之后,每个节点就都把纹理拷贝了一份的原因吧。
2.通过插件把纹理读到内存之后就是解压过的纹理数据了,原来的数据又不保存,再保存的时候当然要指定纹理的格式了。

该用户从未签到

 楼主| 发表于 2014-7-13 16:32:57 | 显示全部楼层
smash 发表于 2014-7-12 23:29
1.估计是原来多个Geode节点共用一些纹理数据,你设置成NO_REFERENCE之后,每个节点就都把纹理拷贝了一份的 ...

首先,谢谢您的持续回答与原因剖析,但我还是不能明白具体怎么实现。
1.如果我不修改设置NO_REFERENCE,那么保存的osgb数据就是纹理和模型分开的。
2.”通过插件把纹理读到内存之后就是解压过的纹理数据了“,那么原始的纹理是什么样子的,我能不能不管它,让它按原始的方式存储呢?

或者,我换个说法,我想做的是:我有一个osgb的数据(模型+纹理在一个osgb文件里面),属性UnRefImageDataAfterApply=true,只修改了某一个坐标的z值,其他不变,然后还让它保存为osgb的数据(模型+纹理在一个osgb文件里面),这个过程怎么实现呢?

非常感谢

该用户从未签到

发表于 2014-7-13 16:48:38 | 显示全部楼层
UnRefImageDataAfterApply值要改成false不是true,否则保存的时候就可能丢纹理。
不要修改设置NO_REFERENCE,writeNodeFile的第二个参数是设置保存的属性,新建一个osgDB::ReaderWriter::Options,修改CacheHintOptions,加上CACHE_IMAGES应该就可以了。

该用户从未签到

 楼主| 发表于 2014-7-14 16:34:26 | 显示全部楼层
谢谢你的回复,也测试你说的方法,好像还是行不通。现在我将我的测试程序发给您,有空的话您看看提点意见,谢谢。

纹理处理.rar

43.72 KB, 下载次数: 121, 下载积分: 威望 1

该用户从未签到

发表于 2014-7-31 11:11:03 | 显示全部楼层
这里您可能是误解了一件事情,osgb格式存储模型+纹理的时候,会把纹理使用OpenGL的形式去存储,诸如jpg之类都会保存为uchar的raw RGB数据,所以当然比直接用jpg要大的多。但是这样存储的好处是加载osgb格式时,纹理可以直接传递到显卡并显示。

而jpg这样的格式是无法直接显示的,桌面系统能够直接被显卡识别的图像格式只有dds。因此您想要把jpg格式原样存储到osgb中并不现实,如果一定要这么做,建议是图像文件在外部独立存储,然后整体再用7z之类的压缩软件做一次打包

该用户从未签到

 楼主| 发表于 2016-1-12 22:34:28 | 显示全部楼层
谢谢13楼用QQ指导了我一个晚上,终于把时隔一年多的问题解决了,再次感谢。如有遇到相似问题的osger,请给我留言。

该用户从未签到

发表于 2016-3-16 15:08:23 | 显示全部楼层
depth 師父,可以幫幫我嗎?我遇到相同的問題,osgb檔過大

该用户从未签到

发表于 2016-3-17 09:51:36 | 显示全部楼层
depth 发表于 2016-1-12 22:34
谢谢13楼用QQ指导了我一个晚上,终于把时隔一年多的问题解决了,再次感谢。如有遇到相似问题的osger,请给 ...

你好,请问能否将思路或是方法给告知一下呢? 不胜感激。

该用户从未签到

发表于 2016-3-19 22:19:59 | 显示全部楼层
大神你好,我想问下我现在有已经映射好的osgb格式的文件,我要怎样才能获取纹理映射关系呢?

该用户从未签到

发表于 2016-3-30 15:16:36 | 显示全部楼层
depth 发表于 2016-1-12 22:34
谢谢13楼用QQ指导了我一个晚上,终于把时隔一年多的问题解决了,再次感谢。如有遇到相似问题的osger,请给 ...

请教您,我遇到了相同的问题,方便给说下思路吗?感谢!

该用户从未签到

发表于 2016-3-30 17:53:10 | 显示全部楼层
您是怎样将模型的纹理压缩的 纹理压缩对文件压缩的效果影响如何呢?非常感谢您的一切帮助!

该用户从未签到

发表于 2017-6-30 11:35:06 | 显示全部楼层
depth你好,我也遇到和你一抹一样的问题。能不能帮我解决一下啊。不胜感激

该用户从未签到

发表于 2020-11-29 17:44:11 | 显示全部楼层
depth 发表于 2016-1-12 22:34
谢谢13楼用QQ指导了我一个晚上,终于把时隔一年多的问题解决了,再次感谢。如有遇到相似问题的osger,请给 ...


depth您好,我也遇到和您相同的问题。能不能帮我解决一下啊。不胜感激

该用户从未签到

发表于 2021-4-26 17:56:54 | 显示全部楼层
UP主,您好,我也同样遇见了合并后的osgb大于纹理和几何的总合,请问您能告诉我是如何解决的么。

该用户从未签到

发表于 2021-9-22 11:11:30 | 显示全部楼层
depth 发表于 2016-1-12 22:34
谢谢13楼用QQ指导了我一个晚上,终于把时隔一年多的问题解决了,再次感谢。如有遇到相似问题的osger,请给 ...

楼主您好,看到您已经解决了这个问题,非常替您高兴,我现在遇到了和您当时一样的问题,可以分享一下您当时的解决方法或者源码吗?非常感谢


“或者,我换个说法,我想做的是:我有一个osgb的数据(模型+纹理在一个osgb文件里面),属性UnRefImageDataAfterApply=true,只修改了某一个坐标的z值,其他不变,然后还让它保存为osgb的数据(模型+纹理在一个osgb文件里面),这个过程怎么实现呢?”

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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