非正方形图集是否有效

is non-square tilable atlas effective

我有一个具有 6K 面的建筑模型,我想使用一些相当高的细节 512x512 可平铺纹理(代表大约 32cm x 32cm)进行纹理处理,并且我希望尽可能适合移动设备,但是不一定是旧手机,但适用于支持 GearVR 的手机。

该模型恰好有大部分长的水平四边形,例如

|-----------|---|----------------|
|-----------|---|----------------|
|-----------|   |----------------|
|-----------|   |----------------|
|-----------|---|----------------|
|-----------|---|----------------|

所以每个水平部分的 uv 都可以堆叠在一个可平铺的纹理上,以实现水平和垂直平铺。

此外,如果图块是 512x512 纹理,我可以将其中的 8 个堆叠在 512x4096 非正方形(但为 2 的幂)纹理中。

这样我就可以使用单一纹理或额外的金属纹理对主网格进行纹理处理。

这合理吗,还是我应该将它们保留为单独的 512x512 纹理?分离纹理不会意味着 8 倍的绘制调用,这比非方形 512x4096 纹理差得多吗?

经过一些研究,我发现使用 trim sheet 调用了堆叠纹理和平铺技术,并且非常有效,并广泛用于游戏开发,以便能够在许多不同的对象上重复使用高细节纹理。

https://www.youtube.com/watch?v=IziIY674NAw

我发现的 trim sheet 信息虽然没有涵盖 'non square' 这是主要问题。但是从几个来源我发现有些设备不支持非正方形,有些支持,有些支持但在非正方形上压缩效果不佳,所以这是一个 'check your target devices' 问题。

假设一个设备确实支持非方形,它实际上应该节省内存来拥有一条纹理,并且应该节省绘制调用,但是当您将纹理导入到'be safe'(再次检查目标设备和引擎)。将堆叠纹理限制为 4 个而不是 16 个可能是明智的,以避免 'worst case scenarios'。

希望这个问题可以通过让视频卡能够在 1 个绘图调用中处理多种材质,或者通过更通用地很好地处理纹理条来解决,但目前的技术水平似乎还没有专注于此.

另一种解决方案更为自定义,但有些人创建了自定义着色器,这些着色器使用网格上的顶点颜色信息来选择要使用纹理的哪一部分,然后从那里平铺。显然开销很低,而且很成功,所以对 'backup plans' 有一个想法是很好的。然而,这将是一种 engine/environment/device 特定类型的优化,而不是一般的建模实践。

http://www.gamasutra.com/blogs/MarkHogan/20140721/221458/Unity_Optimizing_For_Mobile_Using_SubTile_Meshes.php