将矩形图像数据打包成方形纹理

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++ 库在我看来确实很臃肿,但另一方面它有很多选择,并且有很好的文档记录。

【讨论】:

以上是关于将矩形图像数据打包成方形纹理的主要内容,如果未能解决你的问题,请参考以下文章

渲染到纹理 OpenGL ES 2.0

OpenGL-载入纹理

webgl 纹理

将纹理添加到 QT OpenGL 场景图

纹理包装动画图像/精灵表有效-Libgdx

纹理打包器和 2d 游戏精灵表创建