2012-12-27 33 views
0

過去兩天我一直在研究DDS格式和編寫DDS紋理加載器,只是因爲好奇心,我遇到了一些我習以爲常的事情,「間距計算公式」 。我真的很好奇,爲什麼他們完全像他們一樣被指定,沒有任何正當理由。DirectDrawSurface(DDS)間距計算

例如,對於塊壓縮格式(DXT#N,BC#n)構成,全部基於S3TC,它被計算的方式是

MAX(1,(寬度+ 3)/ 4)* blockSize

因此,max給出了兩個值中較大的值,但爲什麼它能夠工作?爲什麼在紋理的寬度上添加3,然後將其分割爲「半邊界」?

在另一方面一些傳統類型是:

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

所以,右移位基本上是移動小數點在二進制基礎上,或除以二。那麼,爲什麼加1,然後除以2並乘以4?要失去最右邊的兩位?

,最後一個,對於其他格式:

(寬×BPP + 7)/ 8

我明白每個像素與最接近的字節邊界分割的位,但爲什麼添加7?

有人可以寫更多關於此?或者將我指向正確的方向?

回答

1

這些計算是四捨五入的,因爲有些格式不能存儲任意寬度的數據。重要的是四捨五入,否則你會失去紋理的像素。你會注意到,通常情況下,加法比要除的數少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個字節的倍數(因此a兩個像素的倍數)