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 :

Appliquer un shader sur le rendu final


Sujet :

DirectX

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Appliquer un shader sur le rendu final
    Bonjour à tous !

    Alors, je vais essayer d'exposer le problème clairement.
    Je travaille sur un jeu en 3D, sont affichés des mesh .x et autres primitives. Je voudrai "salir" le rendu final avec un flou ou autre bruit.
    Je pense qu'utiliser un pixel shader approprié est la meilleure solution, seul problème : l'appliquer sur la totalité du rendu et non étape par étape sur chaque objet (vous me suivez ? ^^).

    Donc j'ai essayé de faire un rendu sur texture et afficher le tout sur un quad face à la caméra. Ca marche et les pertes de puissances sont minimes, problème mes objets .x sont transparent il ne respecte pas la profondeur et affiche les objets et sous objets comme ils viennent ... modifier l'ordre d'affichage des objets ne change rien car sur un simple objet tel une canette, nous voyons les faces cachées.

    J'ai essayé de modifer le cull_mode sans grand succès.

    Ma première question sera ^^ :
    Mais pourquoi le rendu en texture donne un résultat différent d'un rendu normal, les propriétés du buffer d'écriture devraient etre les même non ? J'ai essayé de modifier les RenderState dans tout les sens mais cette transparence persiste.

    Ma deuxième question !
    Y'a t'il une astuce que j'ai raté pour que mon pixel shader traite le rendu final comme un tout ? tel un filtre type sépia, flou etc ...

    Faut'il passer par du multi pass ? j'ai pas trouvé beaucoup de doc la dessus sur le net faut'il absolument faire un render to texture et passer la texture au shader ? ai-je raté quelque chose ? ><

    Voila, j'espère avoir été assez clair.
    J'utilise Directx 9.0c et les shaders jusqu'à la version 3.0 et le moteur est fait maison ^^

    Merci d'avance !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    Pour les objets transparents, es tu sur de bien avoir creer et utiliser un ZBUFFER ?

    Ma deuxième question !
    Y'a t'il une astuce que j'ai raté pour que mon pixel shader traite le rendu final comme un tout ? tel un filtre type sépia, flou etc ...
    Ta question ne semble pas tres claire ... l ideal c 'est de transmettre le code minimale qui permette de constater le bug ... images a l appui si possible

  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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour les post-effect y a pas d'autre choix que je rendre sur texture et d'appliquer le shader à la texture plaquée sur un quad recouvrant l'écran. Donc là pas de souci.

    Par contre pour ton problème, je dirais que tu as un problème de Z-Buffer. Vérifie que tu en as un valide lorsque tu changes de render target.
    Tu peux aussi voir avec le debug runtime ou le reference rasterizer pour voir ce que ça raconte.
    http://jeux.developpez.com/faq/direc...LEMES_probleme

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    problème mes objets .x sont transparent il ne respecte pas la profondeur et affiche les objets et sous objets comme ils viennent
    Pour la transparence des .x, aucune idée...
    Pour le reste, tu oublies sans doute un clear (notamment sur le zbuffer) je pense.
    Il ya l'interface LPD3DXRENDERTOSURFACE qui est là pour t'aider.

    Exemple de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    LPD3DXRENDERTOSURFACE m_RenderToSurface;
    LPDIRECT3DSURFACE9 pRenderSurface; 
    m_Texture->GetSurfaceLevel(0,&pRenderSurface);
    m_RenderToSurface->BeginScene(pRenderSurface, NULL);
    m_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00AAAAAA, 1.0f, 0);
    Rendu(...);
    m_RenderToSurface->EndScene(D3DX_DEFAULT);

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci de vos prompte réponses

    Donc pas le choix, render to texture. Je vais vous mettre le code de ma fonction Render afin de vous montrer les étapes de mon render to texture.

    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
    43
    44
    45
    46
     
    //Création de mes objets pour le render to texture
    	LPDIRECT3DTEXTURE9 _Texture = NULL;
    	LPDIRECT3DSURFACE9 _RenderSurface = NULL, _BackBuffer = NULL;
     
    	Device->CreateTexture(1024, 768, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &_Texture, NULL);
    	_Texture->GetSurfaceLevel(0, &_RenderSurface);
     
    //Je récupère l'ancien Render Target
    	Device->GetRenderTarget(0, &_BackBuffer);
     
    //Je définie le nouveau
    	Device->SetRenderTarget(0, _RenderSurface);
     
    //Je pose ma caméra pour le rendu de la scène
    	Device->SetTransform(D3DTS_VIEW, &Camera->GetViewMatrix());
     
    	Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DXCOLOR(0.8f, 0.8f, 0.8f, 1.0f), 1.0f, 0);
    	Device->BeginScene();
     
    //Affichage de ma scène, mesh, primitives, shaders etc...
     
    	Device->EndScene();
     
    //Je remets l'ancien Render Target
    	Device->SetRenderTarget(0, _BackBuffer);
     
    //Je Change la texture en mémoire du Quad "RenderQuad" utilisé plus bas
    	RenderToTexture->ChangeTexture(0, _Texture);
     
    //Je pose ma caméra pour le quad
    	Device->SetTransform(D3DTS_VIEW, &CameraQuad->GetViewMatrix());
     
    	Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DXCOLOR(0.8f, 0.8f, 0.8f, 1.0f), 1.0f, 0);
    	Device->BeginScene();
     
    //Rendu du quad avec la texture
    		RenderQuad.Render();
     
    	Device->EndScene();
    	Device->Present(0, 0, 0, 0);
     
    //Et quelques releases obligatoires.
    	_BackBuffer->Release();
    	_RenderSurface->Release();
    }
    Voila, ce code marche, juste le problème de la transparence
    Sinon j'ai un petit screen montrant le problème. Vous pouvez voir dessus l'affichage du tabouret très "conceptuel", et on le reconnait difficilement comme cela mais il y a un seau avec un balai dedans, sauf que le balai est derriere le seau et on a l'impression que le seau est "ouvert" ... Enfin, j'espère que ca vous éclairera un peu plus.

    http://img405.imageshack.us/my.php?i...enombrert2.jpg

    ______________

    Smashy : le but est de faire le rendu de toute la scène, et une fois ce rendu effectué, faire un traitement, et non pas à chaque rendu d'objet. C'est peut etre pas encore assez clair ?
    Mais la réponse a été donné, il faut faire forcement un render to texture, et passer cette texture au shader.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    Vérifie avec le lien que t'a donné Laurent, les erreurs données en mode Debug.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Il affiche plus grand chose en mode debug mais il m'a permis de récupérer ce message d'erreur en sortie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Direct3D9: (ERROR) :MultiSampleType between DepthStencil Buffer and RenderTarget must match.
     
    ainsi que 
    Direct3D9: (ERROR) :GetClientRect Failed ?
    Direct3D9: (ERROR) :BitBlt or StretchBlt failed in Present
    à la fin de l'exécution
    Ainsi que tout ce qui suit : Clear failed, DrawPrimitive failed, etc ...

    Au premier coup d'oeil, je reste perplexe face à ce genre d'erreur ...

    Mes Render states sont :

    SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    SetRenderState(D3DRS_ALPHABLENDENABLE , TRUE);
    SetRenderState(D3DRS_SRCBLEND , D3DBLEND_SRCALPHA );
    SetRenderState(D3DRS_DESTBLEND , D3DBLEND_INVSRCALPHA );
    SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE); // <- le problème viendrait'il d'ici ?

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    Et bien tu as la cause de ton erreur.

    Essaye d'utiliser l'interface LPD3DXRENDERTOSURFACE (voir le code que je t'ai donné plus haut). En théorie elle s'occupe de tout.

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE); // <- le problème viendrait'il d'ici ?
    Probablement. Ou bien de la création de la surface de rendu et du Z-buffer, pendant laquelle on peut également spécifier un format d'antialiasing.
    Bref comme le dit le message d'erreur, il faut que les deux aient le même.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Super !

    Avec l'objet LPD3DXRENDERTOSURFACE tout marche nickel ! et le debuggeur en sortie râle même pas

    Merci beaucoup Albenejean, la simplicité au service de l'efficacité ^^

    Voici le code pour ceux qui passeront plus tard.

    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
    43
     
    LPD3DXRENDERTOSURFACE m_RenderToSurface = NULL;
    LPDIRECT3DSURFACE9 pRenderSurface = NULL;
    LPDIRECT3DTEXTURE9 pTexture = NULL;
     
    //Création de la texture 
    Device->CreateTexture(1024, 768, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &pTexture, NULL);
     
    //Création de la surface de rendu
    D3DXCreateRenderToSurface( Device, 1024, 768, D3DFMT_X8R8G8B8, TRUE, D3DFMT_D16, &m_RenderToSurface); 
     
    //Lien entre la texture et la surface de rendu
    pTexture->GetSurfaceLevel(0, &pRenderSurface);
     
    //Rendu de la scène dans la surface
    m_RenderToSurface->BeginScene(pRenderSurface, NULL);
     
    	Device->SetTransform(D3DTS_VIEW, &Camera->GetViewMatrix());
    	Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DXCOLOR(0.8f, 0.8f, 0.8f, 1.0f), 1.0f, 0);
     
    /**/
    /*Affichage de la scène*/
    /**/
     
    m_RenderToSurface->EndScene(D3DX_DEFAULT);
     
    //Changement de la texture du quad
    RenderToTexture->ChangeTexture(0, pTexture);
     
    Device->SetTransform(D3DTS_VIEW, &CameraQuad->GetViewMatrix());
    Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DXCOLOR(0.8f, 0.8f, 0.8f, 1.0f), 1.0f, 0);
     
    //Rendude la scène
    Device->BeginScene();
     
    	RenderQuad.Render();
     
    Device->EndScene();
    Device->Present(0, 0, 0, 0);
     
    //et on clean.
    m_RenderToSurface->Release();
    pRenderSurface->Release();

    On peut donc dire que le problème est résolu Merci pour vos réponses rapides. Me reste plus qu'à passer ça au shader et hop !



    P.S.
    Direct3D9: (ERROR) :GetClientRect Failed ?
    Direct3D9: (ERROR) :BitBlt or StretchBlt failed in Present

    ça vous inspire quelque chose ?

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    P.S.
    Direct3D9: (ERROR) :GetClientRect Failed ?
    Direct3D9: (ERROR) :BitBlt or StretchBlt failed in Present

    ça vous inspire quelque chose ?
    Des fonctions GDI, probablement utilisées en interne lors de l'appel à Present.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/03/2014, 12h15
  2. Appliquer un shader sur un objet 3d simple
    Par n2engineer5 dans le forum API graphiques
    Réponses: 2
    Dernier message: 07/02/2012, 09h40
  3. Question de rendu pour appliquer plusieurs shaders
    Par kaliban dans le forum OpenGL
    Réponses: 9
    Dernier message: 12/09/2007, 12h51
  4. [VB-VS2005]Appliquer une requete sur un datset deja rempli
    Par Pasiphae dans le forum Windows Forms
    Réponses: 3
    Dernier message: 26/01/2006, 15h01
  5. [icone]Comment appliquer une icone sur le.exe
    Par JavaLeDirePartout dans le forum JBuilder
    Réponses: 7
    Dernier message: 24/07/2003, 17h28

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