将矩形图像数据打包成方形纹理
Posted
技术标签:
【中文标题】将矩形图像数据打包成方形纹理【英文标题】:Packing rectangular image data into a square texture 【发布时间】:2010-09-20 19:21:01 【问题描述】:我有 N 项 2D 图像数据,它们都是矩形的,我想尽可能高效地将它们打包成一个 2 的幂次方纹理。
打包这些矩形的算法的简单非高效和幼稚实现很容易启动,但我相信人们已经提出了算法来尽可能有效地执行此操作。我发现了各种对光照贴图打包的参考,这与我正在寻找的类似,但光照贴图算法倾向于考虑非矩形图像,这实际上使事情变得比我需要的更复杂。
有人有提示吗?我应该用谷歌搜索算法或论文作者的名字?
谢谢。
【问题讨论】:
【参考方案1】:您在 1D 中的问题称为装箱。也许这是您搜索的一个良好开端。
请注意,您要解决的问题确实很难(它是 NP 难的)。所以你不应该寻找最优解,而应该寻找一些聪明的启发式算法。
我认为自下而上的动态规划对于 1D 装箱是可能的,但不适用于 2D 情况。
您可以考虑通过仅解决一维问题来简化您的问题,例如将纹理切割成一维中的多个(可变大小)切片。
另一种可能性是对其进行元启发式优化,例如进化算法或粒子群优化。
【讨论】:
【参考方案2】:我需要做你描述的这件事。
这是我使用的 Python 代码,它是 Python Cookbook 中的食谱:
Recipe 442299: pack multiple images of different sizes into one image
【讨论】:
此代码看起来不像是在寻找最佳解决方案。它似乎还想将所有图像打包成一个纹理。【参考方案3】:我遇到了类似的问题,但我正在打包方块。试试这个:http://www.mrashid.info/blog/stacking-squares-problem.php
C++ 代码不是很优雅,但至少你对如何解决这个问题有了基本的了解。
【讨论】:
【参考方案4】:非常好的和简单的打包算法可以在这里找到: http://www.blackpawn.com/texts/lightmaps/
它的实现只需要 200 行 C++ 行,而不是更多(我想你已经有了位图操作例程)。
Jukka Jylänki 介绍了背后的理论 (查找“打包垃圾箱的一千种方法”)。
这篇论文的作者提供的 C++ 库在我看来确实很臃肿,但另一方面它有很多选择,并且有很好的文档记录。
【讨论】:
以上是关于将矩形图像数据打包成方形纹理的主要内容,如果未能解决你的问题,请参考以下文章