贴图的合并
3d 游戏会用到大量的帖图,许多显卡要求贴图的尺寸必须是2的整数次方。这样,许多贴图的边角都会被浪费掉。尤其是大量无关的小贴图,我们通常想把他们合并在一张贴图上,尽量充满整个区域。
合并这些零碎贴图的算法,在学术上被称为排料问题。我尚未找到特别好的解决方法,所以这里就不展开写了。这里想讨论的是这些小贴图的管理。
我们现在的思路是,在engine 的比较上的层次,不用关心需要用的贴图在哪里,在哪张图片上的哪个区域。这样做,就不用局限于相关的图放在一张物理的图片上,可以由工具任意分割打包组合。固然,不相干的贴图过于零碎的逻辑贴图分散在不同的物理图片上,会降低效率。但这个问题就和内存分配器的实现中,内存碎片的问题一样,是不可避免但却可以有诸多方法来改善的。
其实 DirectX 本就充当了一个显存管理器的工作。我们做的只是在这种基于动态的管理模式上再加一层事前的开发期优化而已。
实现的方法很简单,用一个文本文件描述另一个图片文件的区域即可。engine 只需要把这个文件当作一个逻辑贴图打开解析。至于物理图片文件的管理,交给资源管理模块即可。
而这个文件的生成和管理,就得另写一个工具了。能写出优秀的图片自动组合工具固然好,如果没有也可以退而求其次,做一个可以给人像搭积木一样的拼图工具也可以。可以方便的让人来把零散的图片见缝插针的拼到一起,未尝不是一件趣事 :)
关于自动算法,有篇 paper 可以参考。
Comments
Posted by: Vim0x3c | (8) October 8, 2016 02:08 PM
Posted by: Vim0x3c | (7) October 8, 2016 10:25 AM
Posted by: Vim0x3c | (6) October 8, 2016 10:24 AM
Posted by: tscmga | (5) September 27, 2006 03:06 PM
Posted by: zetorchen | (4) April 20, 2006 05:33 PM
Posted by: 千里马肝 | (3) April 19, 2006 03:26 PM
Posted by: zetorchen | (2) April 10, 2006 05:04 PM
Posted by: Siney | (1) April 6, 2006 02:22 PM