« 谢卜勒 (Shapley) 公平三原则 | 返回首页 | 做了个 tga 查看器 »

贴图的合并

3d 游戏会用到大量的帖图,许多显卡要求贴图的尺寸必须是2的整数次方。这样,许多贴图的边角都会被浪费掉。尤其是大量无关的小贴图,我们通常想把他们合并在一张贴图上,尽量充满整个区域。

合并这些零碎贴图的算法,在学术上被称为排料问题。我尚未找到特别好的解决方法,所以这里就不展开写了。这里想讨论的是这些小贴图的管理。

我们现在的思路是,在engine 的比较上的层次,不用关心需要用的贴图在哪里,在哪张图片上的哪个区域。这样做,就不用局限于相关的图放在一张物理的图片上,可以由工具任意分割打包组合。固然,不相干的贴图过于零碎的逻辑贴图分散在不同的物理图片上,会降低效率。但这个问题就和内存分配器的实现中,内存碎片的问题一样,是不可避免但却可以有诸多方法来改善的。

其实 DirectX 本就充当了一个显存管理器的工作。我们做的只是在这种基于动态的管理模式上再加一层事前的开发期优化而已。

实现的方法很简单,用一个文本文件描述另一个图片文件的区域即可。engine 只需要把这个文件当作一个逻辑贴图打开解析。至于物理图片文件的管理,交给资源管理模块即可

而这个文件的生成和管理,就得另写一个工具了。能写出优秀的图片自动组合工具固然好,如果没有也可以退而求其次,做一个可以给人像搭积木一样的拼图工具也可以。可以方便的让人来把零散的图片见缝插针的拼到一起,未尝不是一件趣事 :)

关于自动算法,有篇 paper 可以参考

Comments

TexturePacker
TexturePacker 可以
TexturePacker 可以
日 。 过火了 。。
TextureAtlas 这些工具都只是排列规则的纹理的东东.我想不是楼主的本意
nVidia有一个工具叫TextureAtlas 开源
呵呵,刚写了这样一个工具和生成的图片格式,不过排列算法没有优化,比较慢,最后生成好的大张贴图(或几张)用DDS压缩.
dx9提供了uvatlas工具,可以把来自一个mesh的贴图合并起来,支持x文件,不过它提供了源代码,对于自己的模型格式也可以吧

Post a comment

非这个主题相关的留言请到:留言本