DirectDrawSurface(DDS)音高计算

时间:2012-12-27 17:49:19

标签: directx directdraw

过去两天我一直在研究DDS格式并编写DDS纹理加载器,仅仅是因为好奇心而且我遇到了一些我认为理所当然的“音高计算公式”。我真的很好奇为什么他们被指明的确如此,没有任何理由。

例如,对于块压缩格式(DXT#n,BC#n),所有基于S3TC的计算方式都是

max(1,(width + 3)/ 4)* blockSize

所以,max给出了两个值中较大的值,但为什么它有效?为什么在纹理的宽度上加3,然后将其划分为“半字节边界”?

另一方面,一些传统类型是:

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

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

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

(宽* bpp + 7)/ 8

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

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

1 个答案:

答案 0 :(得分:1)

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

例如,如果添加3则除以4:

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

其余计算考虑了相应格式的存储要求。对于DXT压缩,有4x4像素块,这就是为什么大小是4像素块,然后每个块采用固定数量的字节,这是blockSize乘数。

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