Bonjour,
J'ai une question à propos du code de décompression du block Alpha des Texture DXT5 dans le "Radeon™ SDK - March 2006".
http://developer.amd.com/gpu/radeon/...March2006.aspx
Voici le code compression de l'alpha des Texture DXT5 dans (Image.cpp).
Et voici le code de décompression de l'alpha des Texture DXT5 dans (Image.cpp).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 // Encode a DXT5 alpha block / 3Dc channel block uint64 encodeDXT5AlphaBlock(const int w, const int h, const int xOff, const int yOff, ubyte *source){ ubyte lo = 255; ubyte hi = 0; for (int y = 0; y < h; y++){ ubyte *src = source + yOff * y; for (int x = 0; x < w; x++){ if (*src < lo) lo = *src; if (*src > hi) hi = *src; src += xOff; } } if (hi == lo){ if (hi < 255) hi++; else lo--; } int diff = hi - lo; uint64 block = hi | (lo << 8); static int kRemap[] = { 1, 7, 6, 5, 4, 3, 2, 0 }; for (int y = 0; y < h; y++){ ubyte *src = source + yOff * y; char shift = 12 * y + 16; for (int x = 0; x < w; x++){ int k = (7 * (*src - lo) + (diff >> 1)) / diff; k = kRemap[k]; block |= uint64(k) << shift; src += xOff; shift += 3; } } return block; }
Ma question est y a t il une erreur dans le code de décompression de l'alpha dans les condition "else if (a0 > a1)"?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 // Decode a DXT5 alpha block / 3Dc channel block void decodeDXT5AlphaBlock(ubyte *dest, const int w, const int h, const int xOff, const int yOff, ubyte *src){ ubyte a0 = src[0]; ubyte a1 = src[1]; uint64 alpha = (*(uint64 *) src) >> 16; for (int y = 0; y < h; y++){ ubyte *dst = dest + yOff * y; for (int x = 0; x < w; x++){ int k = ((uint) alpha) & 0x7; if (k == 0){ *dst = a0; } else if (k == 1){ *dst = a1; } else if (a0 > a1){ *dst = ((8 - k) * a0 + (k - 1) * a1) / 7; } else if (k >= 6){ *dst = (k == 6)? 0 : 255; } else { *dst = ((6 - k) * a0 + (k - 1) * a1) / 5; } alpha >>= 3; dst += xOff; } if (w < 4) alpha >>= (3 * (4 - w)); } }
Car dans le code de compression on voit que le premier 8 bits est la valeur la plus élevé de l'alpha et le deuxième 8 bits est la valeur la plus basse de l'alpha. Et ces 2 valeur ne peuvent pas être égal avec ce code.
Et avec cette évidence pour la décompression de l'alpha le code ne peut pas aller plus loin dans les conditions que "else if (a0 > a1)".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 // Boucle pour trouver la valeur Alpha la plus élevé et la moins élever dans le Block de 16 pixels ARGB en cour. for (int y = 0; y < h; y++) // h = 4. { ubyte *src = source + yOff * y; // pour aller à la colonne y suivante. for (int x = 0; x < w; x++) // w = 4. { if (*src < lo) lo = *src; if (*src > hi) hi = *src; src += xOff; // += 4 octets (32 bits). pour aller au pixel suivant. } } if (hi == lo) // si les deux sont égal. { if (hi < 255) hi++; else lo--; }
a0 = le premier 8 bits.
a1 = le deuxième 8 bits.
Les conditions "else if (k >= 6)" et "else" son t elle de trop?
Ou il existe t'il une autre façon de compresser l'alpha sans que le premier 8 bits soit le plus élever et le deuxième 8 bits soit le moins élever?
Merci pour votre aide.
Partager