1

我正在编写一个在 Metal 中使用压缩纹理的程序。我在使用replaceRegion()MTLTexture 的功能时遇到了一些麻烦。该参数bytesPerRow似乎没有意义。它表示对于压缩纹理,“bytesPerRow是从一行块的开头到下一行块的开头的字节数。”

现在我使用 ASTC 和 4x4 块,这意味着我有 8 bpp。那么 4*4 就是 16,8 位就是一个字节。所以我猜测每个块大小是 16 字节。但是,当我输入 16 时,我得到一个失败的断言,要求最小值为 4096。这是怎么回事?

非常感谢你。

4

2 回答 2

1

bytesPerRow = texelsPerRow / blockFootprint.x * 16

于 2015-08-14T00:31:43.833 回答
1
uint32_t bytes_per_row(uint32_t texture_width, uint32_t block_width) {
  return (texture_width % block_width ? texture_width + (texture_width % block_width) : texture_width) / block_width * 16;
}

这首先将纹理宽度四舍五入为块宽度的倍数。例如,以 6x6 块大小编码的 1024x1024 纹理对应于每行 2736 个字节。1026 / 6 * 16 == 2736。

于 2021-05-13T07:43:20.550 回答