2

过去两天我一直在研究 DDS 格式并编写 DDS 纹理加载器,只是出于好奇,我遇到了一些我认为理所当然的东西,即“音高计算公式”。我真的很好奇为什么它们被指定完全一样,没有任何理由。

例如,对于块压缩格式(DXT#n、BC#n),全部基于 S3TC,其计算方式为

最大值(1,(宽度+3)/4)*块大小

所以,max 给出了两个值中较大的一个,但为什么它会起作用呢?为什么要将纹理的宽度加 3,然后将其划分为“半字节边界”?

另一方面,一些遗留类型是:

(( 宽度+1 ) >> 1) * 4

因此,右移基本上是在二进制基础上移动小数点,或除以二。那么,为什么要加 1,然后除以 2 再乘以 4?丢失最右边的两位?

最后一个,对于其他格式:

( 宽度 * bpp + 7) / 8

我了解每个像素的位数和最接近的字节边界划分,但为什么要加 7?

有人可以多写一点吗?或者指出我正确的方向?

4

1 回答 1

1

这些计算正在四舍五入,因为某些格式无法存储任意宽度的数据。四舍五入很重要,否则你会丢失纹理的像素。您会注意到,通常加法比被除数少 1。整数除法通常向下舍入,因此通过比除数加 1,除精确倍数以外的任何数字都将舍入到下一个值。

例如,如果你加 3 然后除以 4:

  • 1 = 1
  • 2 = 1
  • 3 = 1
  • 4 = 1
  • 5 = 2
  • 6 = 2
  • 等等

其余的计算说明了相应格式的存储要求。对于 DXT 压缩,有 4x4 的像素块,这就是为什么大小以 4 个像素块为单位,然后每个块占用固定数量的字节,即 blockSize multiplier。

第二个计算是四舍五入到 2 像素的倍数,然后乘以 4。这表明可能是 16 位像素格式,其中像素为 2 字节宽,行必须是 4 字节的倍数(因此是两个像素的倍数)

于 2012-12-27T17:57:51.930 回答