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 :

Qu'est-ce qui peut empêcher une édition de texture avec lockrect ?


Sujet :

DirectX

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut Qu'est-ce qui peut empêcher une édition de texture avec lockrect ?
    Bonjour, je souhaite éditer une texture en utilisant lockrect, pour cela j'utilise un bout de code qui fonctionnait très bien dans un de mes programmes, et la même si le lockrect se fait bien, les modifications apportées aux pBits ne sont pas visible sur à l'écran.
    Quelqu'un aurait une idée d'oùu ça peut venir ?

    Voila le code que j'utilise:
    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
     
    				D3DSURFACE_DESC d3dsd;
    				IOmbre->GetLevelDesc( 0, &d3dsd );
     
    				// Lock the texture
    				D3DLOCKED_RECT  d3dlr;
    				IOmbre->LockRect( 0, &d3dlr, 0, 0 );
     
    				for(int x=0;x<1024;x++)
    				{
    					for(int y=0;y<1024;y++)
    					{
    						((DWORD*)d3dlr.pBits)[d3dsd.Width*y+x]=0;
    					}
    				}
     
    				// Unlock the texture and return OK.
    				IOmbre->UnlockRect(0);
    Avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	D3DXCreateTextureFromFileEx( m_pd3dDevice, "texture.bmp", 
                    D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_A8R8G8B8, 
                    D3DPOOL_MANAGED, D3DX_FILTER_NONE, 
                    D3DX_FILTER_NONE, 0x00000000, NULL, NULL, &IOmbre );
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 382
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 382
    Points : 20 453
    Points
    20 453
    Par défaut
    Est-tu sur que texture.bmp fait 1024*1024 ?
    Sinon j'ai pris cet exemple dans le SDK de Direct :
    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
    LPDIRECT3DTEXTURE9 m_pTexture;
    
    // Create an alpha texture
    D3DXCreateTexture(m_d3dDevice, 128, 128, 0, D3DUSAGE_RENDERTARGET, 
    	D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_pTexture);
    
    // Initialize the alpha channel
    int  yGrad, xGrad;
    D3DLOCKED_RECT lockedRect;
    
    if(SUCCEEDED(pTexture->LockRect(0, &lockedRect, NULL, D3DLOCK_DISCARD ))
    {
    	m_pRGBAData = new DWORD[128*128];
    	if( m_pRGBAData != NULL )
    	{
    		for( DWORD y=0; y < m_dwHeight; y++ )
    		{	
    			DWORD dwOffset = y*m_dwWidth;
    			yGrad = (int)(((float)y/(float)m_dwWidth) * 255.0f);
    			
    			for( DWORD x=0; x < m_dwWidth; x )
    			{
    				xGrad = (int)(((float)x/(float)m_dwWidth) * 255.0f);
    
    				DWORD b = (DWORD)(xGrad + (255 - yGrad))/2 & 0xFF;
    				DWORD g = (DWORD)((255 - xGrad) + yGrad)/2 & 0xFF;
    				DWORD r = (DWORD)(xGrad + yGrad)/2 & 0xFF;
    				DWORD a = (DWORD)(xGrad + yGrad)/2 & 0xFF;
    
    				lockedRect.pBits[dwOffset+x] = ((a<<24L)+(r<<16L)+(g<<8L)+(b));
    				x++;
    			}
    
    			pTexture->UnlockRect(&lockedRect);
    		}
    	}
    }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut
    Oui ma texture fait bien 1024 par 1024 et le code est sensiblement le meme que dans un autre programme et dans lequel il fonctionne.
    Je ne trouve pas d'ou ça peut venir, si c'est une histoire d'offset je pense qu'il y aurait quand meme un bout de la texture qui changerait, non ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut
    J'ai regardé les valeurs rgb et elles sembles bonnes, j'ai aussi vérifié que les valeurs modifiées étaient encore là a la frame suivante et c'est les cas.
    Donc est-ce que ça veut dire que le texture est modifiée que en mémoire systeme ou je ne sais quoi d'autre ???

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 382
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 382
    Points : 20 453
    Points
    20 453
    Par défaut
    Citation Envoyé par supergrey Voir le message
    Je ne trouve pas d'ou ça peut venir, si c'est une histoire d'offset je pense qu'il y aurait quand meme un bout de la texture qui changerait, non ?
    Eh non parce que le calcul du bon offset c'est prédéterminant.
    S'il n'est pas bon cela va afficher n'importe quoi .

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut
    ok, mais ca afficherait n'importe quoi comme tu dis alors que la la texture reste comme à l'origine.
    De toute façon tanpis, j'ai remis mon code dans un nouveau projet et ça fonctionne, je ne saurais donc jamais d'ou venait le problème.
    Merci quand meme.

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/04/2013, 19h34
  2. [AC-2007] Un même évenement qui peut avoir une ou plusieurs heures le même jour
    Par alfhcg dans le forum Modélisation
    Réponses: 4
    Dernier message: 15/09/2011, 00h23
  3. Qu'est-ce qui peut expliquer que la suppression est longue ?
    Par oneagaindoguys dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/03/2011, 14h08
  4. [AJAX] Qu'est ce qui peut faire que 1 != 1 ?
    Par Sylvain__A_ dans le forum AJAX
    Réponses: 5
    Dernier message: 17/08/2009, 13h55
  5. Qu'est-ce qui peut perturber un écran TFT ?
    Par Keihilin dans le forum Périphériques
    Réponses: 4
    Dernier message: 24/12/2007, 15h03

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