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).

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;
}
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
 
// 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));
	}
}
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)"?

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.

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--;
}
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)".
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.