【问题标题】:Why Texture2D.PackTextures() creates so much empty space in atlas?为什么 Texture2D.PackTextures() 在图集中创建这么多空白空间?
【发布时间】:2023-03-03 19:04:02
【问题描述】:

我正在通过脚本创建纹理图集。我使用 6 张图片来完成此操作,代码如下所示:

    atlasTextures = new Texture2D[6] {frontTexture, topTexture, backTexture, bottomTexture, leftTexture, rightTexture };

    Texture2D atlas = new Texture2D(1024, 1024);
    Rect[] UVs = atlas.PackTextures(atlasTextures, 2, 1024);

    GetComponent<Renderer>().material.mainTexture = atlas;

打包的结果是这样的:

问题是,为什么这段代码会产生这么多空白?由于我将始终只使用 6 个纹理,是否可以使图集更小一些?

【问题讨论】:

  • 我猜你的图像大约是 256x256,而你创建了一个 1024x1024 的图集,所以难怪。使其成为您尺寸的倍数。 768x768 已经可以为您节省一些。不知道 512x768 是否也可以。
  • 这些纹理中的每一个都是 167x167。我将尺寸更改为 Texture2D(512, 512) 和 PackTextures(atlasTextures, 2, 256);而且它更小。你知道 PackTextures() 中的第三个参数是做什么的吗?
  • 这是图集的最大尺寸。

标签: c# unity3d textures uv-mapping texture-packing


【解决方案1】:

图形硬件喜欢处理具有二维幂的纹理,例如 128x1024 (2^7 x 2^10)。他们也可以处理其他纹理大小,但效率较低。这就是为什么引擎通常会尝试导入或生成具有二次幂大小的纹理,即使它会留下一些未使用的纹理空间。由开发人员决定何时覆盖它。

【讨论】:

  • 好吧,还有一个问题,如果我的纹理是 167x167 并且它们可以打包在尺寸为 256x256 的图集中(Debug.Log(atlas.width.ToString() + " " + atlas.height.ToString()); 给出我的 256 256?
  • 好吧,如果你的意思是,所有 6 个纹理都包含在那个 256x256 的图集中,那么显然它们一定是缩小了。如果该图集中仅包含一个,则它的原始大小为 167x167,图集的一些空间未使用。
  • 都适合这个图集。可能正在进行一些裁员。好的,谢谢大家的帮助:)
猜你喜欢
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 2013-01-01
  • 2015-03-04
  • 2019-12-14
  • 2018-08-20
相关资源
最近更新 更多