【问题标题】:Texture mapping or texture tiling for a voxel-based game? (Unity)基于体素的游戏的纹理映射或纹理平铺? (统一)
【发布时间】:2019-08-22 02:00:17
【问题描述】:

我正在构建一个基于体素的游戏,它在许多方面都与 Minecraft 相似,即低分辨率纹理和方块。

显然优化对于这类游戏很重要,原因有很多,但我遇到的有两个似乎是相互排斥的:纹理映射和纹理平铺。

使用纹理映射,我将生成所有现有块纹理的单个纹理映射,我读过它可以大大提高性能。这种优化的问题是纹理平铺似乎是不可能的,因为该技术依赖于纹理文件的第一个和最后一个像素用于相同的纹理,而在使用映射时不再适用。这也意味着据我所知,相邻块的混乱永远无法合并。

通过平铺,可以将具有相同纹理的大块块组合成一个 2 个三元网格。虽然效率很高,但每个纹理都需要自己的 Material 对象,这意味着每个不同的块纹理都需要自己的子网格。

其中哪一个更有可能提供卓越的整体性能?

【问题讨论】:

  • 合并网格听起来不错,但很难实现。
  • 结合纹理将是一件好事。使用硬件实例绘制多个网格。在实例数据中包含一个纹理索引以寻址正确的纹理(通过除以平铺计数来重新寻址 UV)。您甚至可以尝试使用几何着色器生成立方体。

标签: c# unity3d mesh voxel


【解决方案1】:

它们似乎相互排斥,但实际上并非如此。
Minecraft 不会重复纹理,它会重复 UV。

工作原理:
对于共享纹理的所有矩形,确保它们的 UV 位于同一位置。
例如,所有草矩形都应将其 UV 放在图集中草纹理的顶部。
为了让它看起来不错,你需要seamless textures
此外,为了防止边缘渗色,您需要确保所有纹理之间都有一些 padding

示例:
我做了一个快速搅拌机项目来展示它。
侧面的矩形都在相同的纹理区域具有 UV,而顶部的矩形在不同的纹理区域具有 UV。
“重复”是通过使用图集中的无缝纹理来完成的。
在这种情况下。没有添加填充,因为像素化纹理不需要它。

纹理取自 Minecraft。

【讨论】:

  • 点过滤和无 mips 不需要填充。不过,如果这可以接受,则取决于您的游戏,没有 mips 的高分辨率纹理在远处可能看起来很糟糕。
  • 我在示例中提到过。但是 OP 没有具体说明他是如何过滤的,只是说它是低分辨率的,有点像我的世界。
  • 我认为@QuaternionsRock 的意思是,他正在通过合并多个立方体来组合它们,这会产生平铺纹理无法重复的问题。
  • 为什么?只要 UV 不改变,纹理就会按照定义重复。只有当 UV 位于纹理空间之外时,纹理重复和钳制才会生效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多