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 :

Problème avec D3DXCreateTextureFromFileEx


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de amaury pouly
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 157
    Par défaut Problème avec D3DXCreateTextureFromFileEx
    Salut, j'ai un code pour charger une texture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    res=D3DXCreateTextureFromFileEx(Device,tex[i].Path,tex[i].Width,
                     tex[i].Height,1,D3DUSAGE_RENDERTARGET,
                    (_D3DFORMAT)tex[i].Format,D3DPOOL_DEFAULT,
                     D3DX_FILTER_NONE,D3DX_DEFAULT,
                     tex[i].ColorKey,NULL,NULL,tex[i].Texture);
    Et il me renvoit D3DERR_INVALIDCALL . Je ne comprend pas :
    Est-ce que quelqu'un peut m'éclairer sur cette question ????
    Pour info, les param sont suivants :
    tex[i].Format=R8G8B8
    tex[i].ColorKey=0x00000000
    tex[i].Path="res\Back0.bmp"
    tex[i].Width=200
    tex[i].Height=200
    et le format de la texture est 24 bit, 200x200

  2. #2
    Membre éprouvé
    Inscrit en
    Mai 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 99
    Par défaut
    De memoire ( car je n'ai pas la doc sous la main ), il y a des limitations sur le pool a utiliser pour les render targets.

    De plus et surtout, je ne vois pas comment DX pourrait associer une render target a un fichier... Je ne sais pas exactement ce que tu cherches a faire mais tu es sur une mauvaise piste.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Attention aussi aux dimensions, tu pourrais être limité à des puissances de 2 par ton driver.
    Sinon concernant le pool à utiliser pour les render target c'est bien D3DPOOL_DEFAULT.

  4. #4
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    Le pool est bon,

    Les dimensions seraient bien mieux si elles étaient puissance de deux.
    Si ton fichier ne fait pas 256x256 par ex, ca ne gene pas, D3dX refait le dimensionnement pour toi (meme si c'est mieux de demander à tes artistes d'utiliser plutot 256x256 ou 256x128 etc..).
    Sur les prochains hardware ca devrait poser moins de probleme (spéculation): Si le caps NONPOW2CONDITIONAL en conjonction avec POW2 est mis ça veut dire que le hardware ne peut pas effectuer toutes les opérations possibles sur les textures qui ne sont pas en puissances de deux, d'où l'interet de partir de dimensions de deux au départ pour ne pas avoir a agrandir et filtrer de manière crade au chargement de la texture.

    Par contre r8g8b8 c'est plutot douteux.
    A mon avis tu gagnerais beaucoup à verifier le debug output de d3d/d3dx,
    parce que ce format de texture/rendertarget est assez peu courant,
    en general on lui prefere A8R8G8B8, X8R8G8B8 (canal alpha non utilisé), ou encore les formats compressés DXTC.

    En regle general si tu n'as pas de requirement particulier (si tu ne veux pas forcer le mode 16 bits ou compressé pour les textures par exemple) tu demandes le format UNKNOWN et il choisit celui qui est adapté à ton format de fichier original (probablement X8R8G8B8) a toi de verifier la variable format en retour pour savoir ce qu'il a choisi pour toi.

    A+
    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  5. #5
    Membre éprouvé
    Inscrit en
    Mai 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 99
    Par défaut
    Dans ce post, je ne comprends pas pourquoi charger les bits d'un fichiers pour faire une render target... Si qq'un pouvait m'expliquer le but de la manip'.

    Pour faire de l'offscreen rendering, moi je procede toujours comme ci-dessous. Y'a-t'il plus rapide ? Plus simple ?


    Declarations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	LPD3DXRENDERTOSURFACE	RenderToSurface	;	// Surface for rendering to texture
    	LPDIRECT3DTEXTURE9	    DynTexture      ;	// Dynamic texture 
    	LPDIRECT3DSURFACE9      TextureSurface  ;   // Level 0 of the above texture 
    	enum { DynamicTextureSize = 512 } ;         // Size for the dynamic texture
    (Re)Creation sur lost device :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    		// Create the dynamic texture
    		HRESULT hr = Device->CreateTexture (  
    			DynamicTextureSize , DynamicTextureSize , 
    			1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, & DynTexture, NULL ) ; 
    		if ( FAILED ( hr ) )
    			return E_FAIL ;
    		// Create an off-screen "render to" surface...
    		D3DSURFACE_DESC desc;
    		DynTexture->GetSurfaceLevel ( 0, & TextureSurface );
    		TextureSurface->GetDesc( & desc );
    		hr = D3DXCreateRenderToSurface 
    			( Device, desc.Width, desc.Height, desc.Format, TRUE, D3DFMT_D16, & RenderToSurface );
    Exemple d'utilisation :

    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
     
    		hr = RenderToSurface->BeginScene( TextureSurface, NULL );
    		hr = Device->Clear ( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xFF000000 , 1.0f, 0);
    		// Render to surface
    		CachedDevice->SetFVF ( D3DFVF_SPRITEVERTEX ) ;
    		CachedDevice->SetTexture ( 0, Texture );
    		CachedDevice->SetStreamSource ( 0, SpriteVB, 0 , sizeof ( SPRITEVERTEX ) ) ;
    		// adjust transforms 
    		Matrix TextureWorld ; 
    		D3DXMatrixScaling ( & TextureWorld , ( float ) DynamicTextureSize , ( float ) DynamicTextureSize , 1.0f ) ; 
    		Device->SetTransform ( D3DTS_WORLD, & TextureWorld );
    		Matrix View ; 
    	    D3DXMatrixIdentity ( & View ) ;
    	    Device->SetTransform ( D3DTS_VIEW , & View ) ;
    		Matrix Projection ; 
    		D3DXMatrixOrthoLH ( & Projection , ( float ) DynamicTextureSize , ( float ) DynamicTextureSize , 0.0f , 1.0f ) ; 
    	    Device->SetTransform ( D3DTS_PROJECTION, & Projection ) ;
    		// Render the triangle list to texture 
    		hr = Device->DrawPrimitive ( D3DPT_TRIANGLELIST, 4 , Width * Height * 2 ) ;
    		if ( FAILED ( hr ) ) 
    		{
    			return hr ; 
    		} ; 
    	    hr = RenderToSurface->EndScene( 0 ) ;

  6. #6
    Membre éprouvé Avatar de amaury pouly
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 157
    Par défaut re
    Le fait de mettre en render target et de pouvoir mettre la texture comme cible de rendu après mais bon comme c'est pas super important mais ta méthode m'a l'air intéressante, je vais la tester . Merci encore .

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Moi j'ai une question : est-ce que le fait d'utiliser un LPD3DXRENDERTOSURFACE apporte réellement quelque chose par rapport à la version "classique" (appels à SetRenderTarget() / SetDepthStencil()) ?

  8. #8
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    Oui et non
    c'est la pour te simplifier la vie
    en n'ayant pas a creer la surface de rendu
    et pour oublier d'avoir a faire le release
    apres les appels aux fonctions get.

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  9. #9
    Membre éprouvé
    Inscrit en
    Mai 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 99
    Par défaut
    pour repondre a Loulou : Je ne sais pas si ma methode est meilleure ou non... La premiere fois que j'ai voulu faire un rendu sur texture, j'ai lance google et j'ai trouve un exemple avec cette technique. Elle m'a toujours donne de bons resultats, mais bon, je cherche a savoir si on peut mieux faire. "Mieux" voulant dire ( comme d'hab ) plus rapide niveau frame rate...

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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