IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

Texture DXT5 Alpha


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 108
    Par défaut Texture DXT5 Alpha
    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.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 108
    Par défaut
    J'ai trouvé la réponse moi-même!

    C'est qu'il y a 2 méthodes pour compresser l'Alpha d'une Texture DXT5. Et dans le SDK de ATI il utilise seulement la première méthode de compression de l'Alpha de Texture DXT5 avec cette fonction "encodeDXT5AlphaBlock()". Et dans la fonction "decodeDXT5AlphaBlock" du SDK de ATI il peut décoder l'alpha de la Texture DXT5 selon les 2 méthodes.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. texture et alpha
    Par Rniamo dans le forum OpenGL
    Réponses: 16
    Dernier message: 23/06/2008, 23h04
  2. Render to Texture / couche alpha
    Par julien_v3ga dans le forum OpenGL
    Réponses: 8
    Dernier message: 15/11/2006, 10h10
  3. DX9: Alpha blending dans une texture intermédiaire
    Par Bart1971 dans le forum DirectX
    Réponses: 2
    Dernier message: 30/10/2006, 14h21
  4. [JAVA3D] Comment active-t-on l'alpha sur une texture?
    Par SuperCed dans le forum OpenGL
    Réponses: 3
    Dernier message: 08/06/2005, 10h50
  5. Combiner plusieurs textures avec couches alpha
    Par TibobiT dans le forum OpenGL
    Réponses: 2
    Dernier message: 01/05/2004, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo