过去两天我一直在研究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?
有人可以多写一点吗?还是指出我正确的方向?
答案 0 :(得分:1)
这些计算是四舍五入的,因为某些格式无法存储任意宽度的数据。向上舍入很重要,否则你会丢失纹理上的像素。你会注意到通常加法比被除以的数字少1。整数通常向下舍入,因此通过加1小于除数,除了精确倍数之外的任何数字都将舍入到下一个值。
例如,如果添加3则除以4:
其余计算考虑了相应格式的存储要求。对于DXT压缩,有4x4像素块,这就是为什么大小是4像素块,然后每个块采用固定数量的字节,这是blockSize乘数。
第二个计算是四舍五入到2个像素的倍数,然后再乘以4.这表明可能是一个16位像素格式,其中像素是2个字节宽,并且该行必须是4个字节的倍数(因此是一个倍数)两个像素)