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 :

D3DXSaveSurfaceToFile affecte-t-il les surfaces ?


Sujet :

DirectX

  1. #1
    Membre régulier Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Points : 90
    Points
    90
    Par défaut D3DXSaveSurfaceToFile affecte-t-il les surfaces ?
    Bonjour,

    Je vous expose mon problème.
    Je souhaite afficher un texte sous forme de texture, donc création de texture dynamique, la surface de la texture est mis en render target etc.
    Voici le 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    // je creé une texture dynamique
     
    hRes=m_pD3DDevice->CreateTexture(TexW,TexH,1,D3DUSAGE_RENDERTARGET,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&pTexture,0);
    hRes=pTexture->GetSurfaceLevel(0,&pSurface);
     
    //je la met en render target
     
    hRes=m_pD3DDevice->SetRenderTarget(0,pSurface);
     
    // je clear et j'écris du texte dedans
     
    m_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,0x00000000,1.0f,0);
    pD3DXFont->DrawText(NULL,Text,(int)(strlen(Text)),&TextRect,Format|DT_EXPANDTABS,pD3DGFont->Color);
     
    // je crée un quad (x,y,z,u,v) ici 
    // QuadText[..]=...
    // puis je repasse mon backbuffer en render target
     
    hRes=m_pD3DDevice->SetRenderTarget(0,m_pBBSurface);
     
    // quelques rotations translations
     
    m_pD3DDevice->GetTransform(D3DTS_WORLD, &matWorld);
    D3DXMatrixRotationZ(&matRot,Angle/180.0f*D3DX_PI);
    D3DXMatrixTranslation(&matTrans,BoxCenter.x,BoxCenter.y,0);
    D3DXMatrixTranslation(&matTransAnchor,floorf(BoxCenter.x-Anchor.x)+0.5f,floorf(BoxCenter.y-Anchor.y)+0.5f,0);
    matNewWorld=matTransAnchor*matRot*matTrans*matWorld;
    m_pD3DDevice->SetTransform(D3DTS_WORLD,&matNewWorld);
     
    // puis je trace
     
    m_pD3DDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
    m_pD3DDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    m_pD3DDevice->SetTexture(0,pTexture);
    m_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_TEX1);
    m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,QuadText,sizeof(VERTEXTEX));
    Le problème c'est que ca ne s'affiche pas toujours bien sur certaines cartes graphiques, les textures semblent striées.
    A gauche une Rage128, à droite une Radeon9800.



    Je me suis demandé si les textures etaient correctement crées, donc j'ai fais un D3DXSaveSurfaceToFile et D3DXSaveTextureToFile (juste avant de tracer) pour voir. J'ai eu la confirmation que les textures étaient toutes propres. Et j'ai eu la surprise de voir un affichage impeccable sur la Rage128, identique à ce que donnait la Radeon9800.

    Sur le screenshot plus haut on voit le "Facteur vent" qui est bien affiché. Et bien c'est sur cette texture seule que j'ai fais un D3DXSaveSurfaceToFile (ou D3DXSaveTextureToFile).

    Questions :
    - D3DXSaveSurfaceToFile (ou D3DXSaveTextureToFile) semble modifier la texture, ou quelquechose dans le device. Savez-vous quoi ?
    - D'ou peut venir mes textures striées ?

    Merci,
    Antoine.

  2. #2
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920

  3. #3
    Membre régulier Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Points : 90
    Points
    90
    Par défaut
    Merci Loulou de ta réponse.

    J'ai beaucoup cherché sur google, sans rien trouvé.
    Je vais peut etre finir par installer le sdk directx sur mon autre pc (avec la vieille carte graphique).

    J'avais reussi à venir a bout de ce problème en faisant des décalages de +0.5f sur le quad qui affiche la texture, mais j'ai été obligé de tout modifier à cause des rotations. Mon but est d'avoir une police aussi claire que possible (donc tout est au pixel, 1/2 pixel ) sur du 2D sans utiliser le GDI.

    Merci,
    Antoine.

    Edit : reference rasterizer...c'est une bonne idée, j'essaie demain.

  4. #4
    Membre régulier

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2005
    Messages : 53
    Points : 114
    Points
    114
    Par défaut
    Quel type de filtrage utilise tu pour les textures? Es que tu a essaié de le modififier?

  5. #5
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920

  6. #6
    Membre régulier Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Points : 90
    Points
    90
    Par défaut
    Le type de filtrage est D3DTEXF_LINEAR, j'ai essayé aussi D3DTEXF_POINT, sans succes (ce sont les deux seuls supportés par la carte)

    Par contre, je viens d'essayer avec le reference rasterizer, et tout s'affiche bien. Donc a priori ce serait une fonction non supportée, mais je ne vois absolument pas quoi.
    j'ai essayé differents format de back buffer, et render target, en regardant ceux qui étaient supportés, a8r8g8b8, r5g6b5.

    Je vais essayer de faire une version de mon programme qui peut m'afficher le debug directx, au cas ou il y aurait de l'info dedans.

    Edit : Merci Loulou, je regarde ca de plus pres.

  7. #7
    Membre régulier Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Points : 90
    Points
    90
    Par défaut
    Des nouvelles...je n'ai rien trouvé d'interessant dans les logs de debug directx.

    Par contre le D3DXSaveSurfaceToFile resout mon problème

    Si je fais dans cet ordre :

    D3DXSaveSurfaceToFile(...)
    m_pD3DDevice->DrawPrimitiveUP(...)

    Tout est bien affiché.
    Par contre si je fais dans cet ordre :

    m_pD3DDevice->DrawPrimitiveUP(...)
    D3DXSaveSurfaceToFile(...)

    J'ai mon affichage sale, comme sur le screenshot.
    Dans les deux cas les textures enregistrées sont propres.

    J'ai testé le decalage des (u,v) comme dans la FAQ, mais sans succes.
    J'ai supprimé tous les SetSamplerState() pour laisser tout par défaut, mais rien n'y fait.
    De toute facon, je n'ai pas besoin de resampler les textures car elles sont affichées à leur taille réelle (la matrice de projection est ortho pour avoir un affichage 2D) . Mon quad ne prend qu'une partie de la texture. Si il fait w et h de largeur et hauteur et que ma texture W et H, j'écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    QuadText[0]=MAKEVERTEXTEX( -w/2.0f , -h/2.0f , 0 ,   0   , h/H);
    QuadText[1]=MAKEVERTEXTEX( -w/2.0f ,  h/2.0f , 0 ,   0   ,   0);
    QuadText[2]=MAKEVERTEXTEX(  w/2.0f ,  h/2.0f , 0 , w/W , h/H);
    QuadText[3]=MAKEVERTEXTEX(  w/2.0f , -h/2.0f , 0 , w/W ,   0);
    Avant j'avais à la place des h/H et w/W des 1 car mon Quad faisait la taille de ma texture...

  8. #8
    Membre régulier Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Points : 90
    Points
    90
    Par défaut
    En deplacant mon quad par pas de 0.1 pixels (avec une translation par matrice) certaines textures s'affichent bien, d'autres disparaissent.
    Plus ma texture est grande (je la force en 512x512 ou 1024x1024) et moins j'ai de stries sur mes textures...elles s'affichent presque proprement.

    Si quelqu'un a une idée...

  9. #9
    Membre régulier Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Points : 90
    Points
    90
    Par défaut
    J'ai finalement réécrit le tout avec des sprites, c'est moins "flexible" que du quad texturé, mais j'étais à bout

    Je laisse le topic en non résolu...si quelqu'un trouve la solution ou à une piste, ca m'intéresse.

Discussions similaires

  1. detecter les arretes et les surfaces d'un maillage 3D par un clic souris
    Par tasnim2010 dans le forum Développement 2D, 3D et Jeux
    Réponses: 8
    Dernier message: 04/05/2012, 11h25
  2. comment affecter à un datagrid, les données d'une table ?
    Par WBO dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 24/12/2008, 12h59
  3. [forms 6i][8i] affecter SYSDATE AVEC les heures
    Par Magnus dans le forum Oracle
    Réponses: 5
    Dernier message: 14/02/2006, 14h27
  4. Opengl -- Les surfaces
    Par Anonymous dans le forum OpenGL
    Réponses: 2
    Dernier message: 02/05/2002, 10h14

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