Directx DirectDrawsure(DDS)节距计算

Directx DirectDrawsure(DDS)节距计算,directx,directdraw,Directx,Directdraw,在过去的两天里,我一直在研究DDS格式并编写一个DDS纹理加载器,只是出于好奇,我偶然发现了一些我习以为常的东西,“音高计算公式”。我真的很好奇,为什么它们被指定为完全一样,没有任何理由 例如,对于所有基于S3TC的块压缩格式(DXT#n、BC#n),其计算方式是 最大(1,(宽度+3)/4)*块大小 所以,max给出了两个值中较大的一个,但为什么它会起作用呢?为什么要在纹理的宽度上加上3,然后将其划分为“可啃边界” 另一方面,一些遗留类型是: ((宽度+1)>>1)*4 所以,右移基本上是在二

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

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

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

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

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

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

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

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

(宽度*bpp+7)/8

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


有人能再多写一点吗?或者给我指出正确的方向?

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

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

  • 1=1
  • 2=1
  • 3=1
  • 4=1
  • 5=2
  • 6=2
  • 等等
其余的计算说明了各自格式的存储要求。对于DXT压缩,有4x4个像素块,这就是为什么大小为4个像素块,然后每个块采用固定数量的字节,即块大小乘数

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