2012-12-27 2 views
0

J'ai étudié le format DDS et écrit un chargeur de texture DDS pour les deux derniers jours, juste par curiosité et je suis tombé sur quelque chose que je tenais pour acquis, les "formules de calcul de hauteur" . Je suis vraiment curieux de savoir pourquoi ils sont spécifiés exactement comme ils le sont, sans aucune justification.Calcul de hauteur DirectDrawSurface (DDS)

Par exemple, pour des formats comprimé de blocs (DXT # n, BC# n), tous basés sur S3TC, la façon dont il est calculé est

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

Donc, max donne la plus grande des deux valeurs, mais pourquoi cela fonctionne-t-il? Pourquoi ajouter 3 à la largeur de la texture et ensuite la diviser sur une "limite de grignage"?

Certains types existants d'autre part sont:

((largeur + 1) >> 1) * 4

Ainsi, un décalage vers la droite est essentiellement le déplacement du point de base dans une base binaire, ou divisant par deux. Alors, pourquoi ajouter 1, puis diviser par deux et multiplier par 4? Perdre les deux bits les plus à droite?

Et le dernier, pour d'autres formats:

(largeur * BPP + 7)/8

Je comprends les bits par pixel et la division de limite d'octet le plus proche, mais pourquoi ajouter 7?

Quelqu'un peut-il en écrire un peu plus? Ou pointez-moi dans la bonne direction?

Répondre

1

Ces calculs sont arrondis, car certains formats ne peuvent pas stocker de données de largeur arbitraire. Il est important d'arrondir, sinon vous perdriez des pixels de la texture. Vous noterez que généralement l'addition est 1 moins que le nombre étant divisé par. Entier divise normalement en arrondissant vers le bas, donc en ajoutant 1 moins que le diviseur, tout nombre autre qu'un multiple exact arrondira à la valeur suivante.

Par exemple, si vous ajoutez 3 puis diviser par 4:

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

Le reste des calculs tient compte des exigences de stockage du format respectif. Pour la compression DXT, il existe des blocs 4x4 de pixels, ce qui explique pourquoi la taille est en blocs de 4 pixels, puis chaque bloc prend un nombre fixe d'octets, qui est le multiplicateur blockSize. Le second calcul arrondit à un multiple de 2 pixels, puis multiplie par 4. Cela suggère peut-être un format de pixel de 16 bits où les pixels ont une largeur de 2 octets et la ligne doit être un multiple de 4 octets (donc un multiple de deux pixels)