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

Développement 2D, 3D et Jeux Discussion :

Directx 8 Probleme avec setrenderTarget pour un rendu du monde sur une texture


Sujet :

Développement 2D, 3D et Jeux

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Directx 8 Probleme avec setrenderTarget pour un rendu du monde sur une texture
    Bonjour a tous.
    Je vous expose mon probleme:
    Je dois réaliser un filtre sous directx 8 sans pixel shader, pour ce faire je crée un carré sur lequel je veux plaquer une texture dans laquelle jai copié la surface de rendu (device->setRenderTarget(masurface) )
    Mais apparament je fais ca mal car mon carré affiche une texture toute bizarre et mon objet s affiche quand meme derriere ce carré (je veux que tout s'affiche uniquement dans cette zone de rendu)

    je vais vous montrer mon code car je galère a trouver mon erreur

    Partie initialisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //je crée la texture de rendu
    g_pd3dDevice->CreateTexture(600, 600, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &g_pTexture);
    //je prends la surface 0  de celle-ci
    g_pTexture->GetSurfaceLevel (0, &pLevel0Surface);
    device
    //sauvegarde du stencil buffer
    g_pd3dDevice->GetDepthStencilSurface(&pZSurface);

    ensuite dans la partie rendu:

    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
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                             D3DCOLOR_COLORVALUE(0.0f,0.0f,0.0f,1.0f), 1.0f, 0 );
     
    //je dis a DX de déssiner dans ma texture	
    g_pd3dDevice->SetRenderTarget (pLevel0Surface, pZSurface);
     
     
    g_pd3dDevice->BeginScene();
    //dessin du carré contenant la texture
    g_pd3dDevice->SetTexture( 0, g_pTexture );
    g_pd3dDevice->SetStreamSource( 0, g_pVertexBuffer, sizeof(Vertex) );
    g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX );
    g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
    g_pd3dDevice->EndScene();
     
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );

    Je vois vraiment pas ce qui manque (svp soyez sympa jsui un debutant sous DX )
    Merci de m'aider j'en peux plus !!!!!

  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
    Par défaut
    On peut voir le code de rendu complet ? Parce que là avec des bribes ça donne un peu n'importe quoi.
    Un petit screenshot aussi peut-être, pour mieux cerner ce qui se passe ?

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Voici mon 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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    struct Vertex
    {
        float x, y, z;
        float tu, tv;
    };
     
    Vertex g_quadVertices[] =
    {
    	{-1.0f, 1.0f, 2.0f,  0.0f,0.0f },
    	{ 1.0f, 1.0f, 2.0f,  1.0f,0.0f },
    	{-1.0f,-1.0f, 2.0f,  0.0f,1.0f },
    	{ 1.0f,-1.0f, 2.0f,  1.0f,1.0f }
    };
     
     
     
    Vertex g_g_objectVertices[] =
    {
    	{-0.5f, 0.5f, 4.0f,  0.0f,0.0f },
    	{ 0.5f, 0.5f, 4.0f,  1.0f,0.0f },
    	{-0.5f,-0.5f, 4.0f,  0.0f,1.0f },
    	{ 0.5f,-0.5f, 4.0f,  1.0f,1.0f }
    };
     
    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_TEX1)
     
     
    //-----------------------------------------------------------------------------
    // Name: loadTexture()
    // Desc: 
    //-----------------------------------------------------------------------------
    void loadTexture(void)
    {
    	// On crée la texture dans laquelle on va copier notre surface de rendu
    	g_pd3dDevice->CreateTexture(800, 800, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &g_pTexture);
    	// On récupère la surface principale, c'est elle qui va nous servir pour le rendu
    	g_pTexture->GetSurfaceLevel (0, &pLevel0Surface);
     
    	// On récupère le Z-Buffer qui a était passé lors de la création du device
    	g_pd3dDevice->GetDepthStencilSurface(&pZSurface);
     
     
    	D3DXCreateTextureFromFile( g_pd3dDevice, "texturebois.bmp", &g_ptextureObjet );
    	g_pd3dDevice->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
    	g_pd3dDevice->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
    }
     
    //-----------------------------------------------------------------------------
    // Name: init()
    // Desc: 
    //-----------------------------------------------------------------------------
    void init( void )
    {
        g_pD3D = Direct3DCreate8( D3D_SDK_VERSION );
     
        D3DDISPLAYMODE d3ddm;
     
        g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm );
     
        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory( &d3dpp, sizeof(d3dpp) );
     
        d3dpp.Windowed               = TRUE;
        d3dpp.SwapEffect             = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat       = d3ddm.Format;
        d3dpp.EnableAutoDepthStencil = TRUE;
        d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
     
        g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd,
                              D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                              &d3dpp, &g_pd3dDevice );
     
    	loadTexture();
    	void *pVertices = NULL;
    	g_pd3dDevice->CreateVertexBuffer( 4*sizeof(Vertex), D3DUSAGE_WRITEONLY, 
                                          D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, 
                                          &g_pVertexBuffer );
     
     
        g_pVertexBuffer->Lock( 0, sizeof(g_quadVertices), (BYTE**)&pVertices, 0 );
        memcpy( pVertices, g_quadVertices, sizeof(g_quadVertices) );
        g_pVertexBuffer->Unlock();
     
    	g_pd3dDevice->CreateVertexBuffer( 4*sizeof(Vertex), D3DUSAGE_WRITEONLY, 
                                          D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, 
                                          &g_pVertexBufferObjet );
     
     
        g_pVertexBufferObjet->Lock( 0, sizeof(g_g_objectVertices), (BYTE**)&pVertices, 0 );
        memcpy( pVertices, g_g_objectVertices, sizeof(g_g_objectVertices) );
        g_pVertexBufferObjet->Unlock();
     
     
        D3DXMATRIX matProj;
        D3DXMatrixPerspectiveFovLH( &matProj, 45.0f, 640.0f / 480.0f, 0.1f, 100.0f );
        g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
     
    	g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    }
     
     
    //-----------------------------------------------------------------------------
    // Name: render()
    // Desc: 
    //-----------------------------------------------------------------------------
    void render( void )
    {
        g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                             D3DCOLOR_COLORVALUE(0.0f,0.0f,0.0f,1.0f), 1.0f, 0 );
     
        D3DXMATRIX matWorld;
        D3DXMatrixTranslation( &matWorld, 0.0f, 0.0f, 3.0f );
        g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
    	g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE);
    	g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
    /*
    	g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
    	g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
    	g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
    */	
     
    	g_pd3dDevice->SetRenderTarget (pLevel0Surface, pZSurface);
    	g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                             D3DCOLOR_COLORVALUE(0.0f,0.0f,0.0f,1.0f), 1.0f, 0 );
     
     
        g_pd3dDevice->BeginScene();
     
        g_pd3dDevice->SetTexture( 0, g_pTexture );
        g_pd3dDevice->SetStreamSource( 0, g_pVertexBuffer, sizeof(Vertex) );
        g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX );
    	g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
     
    	g_pd3dDevice->SetTexture( 0, g_ptextureObjet );
        g_pd3dDevice->SetStreamSource( 0, g_pVertexBufferObjet, sizeof(Vertex) );
        g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX );
    	g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
     
        g_pd3dDevice->EndScene();
     
        g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
     
    }

  4. #4
    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
    Par défaut
    Là tu rends tout dans ta texture (y compris un quad texturé avec celle-ci -- je ne sais pas si le comportement est bien défini).

    Il faut rendre ton objet dans la texture, réactiver la rendertarget initiale (tu peux la récupérer après création du device par exemple, et la stocker), puis rendre ton quad texturé.

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Ok, que fais exactement setRenderTarget?
    Je crois que j'ai pas bien compris sonr but...

  6. #6
    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
    Par défaut
    Elle change la cible de rendu courante (le backbuffer). Par défaut quand tu crées le device, un backbuffer est également créé. Si tu veux afficher non pas à l'écran mais sur une texture, tu peux envoyer cette texture (ou plutôt sa surface 0) en tant que nouveau back buffer : c'est le rôle de SetRenderTarget. Et dès que tu veux réafficher sur ton backbuffer par défaut (donc à l'écran), il faut le restaurer avec SetRenderTarget.

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    OK merci j'y vois plus clair.
    Je vais restaurer mon backbuffer d'origine donc.

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Ca y es j'ai fini ! Enfin.

    j'avai mal séparé la partie rendu dans la texture et la partie rendu dans le backbuffer d'origine.
    Puis il faut faire un getSurfacelevel a chaque boucle avant le setRenderTarget.

    Et enfin lorsque j'utilise une résolution de texture supérieure à 400 ca ne marche plus ( pourquoi???? ).

    Je posterai bientot les sources de ce filtre (blur).

Discussions similaires

  1. Probleme avec code pour fond musical
    Par Yanout dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 05/09/2007, 17h12
  2. probleme avec IE pour alignement en haut dans un tableau
    Par italiasky dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 05/02/2007, 12h48
  3. Probleme avec DateDiff pour les années....
    Par angelevil dans le forum VB 6 et antérieur
    Réponses: 23
    Dernier message: 27/03/2006, 09h19
  4. Probleme avec ODBC pour la V8.
    Par chad33 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 04/03/2005, 23h57
  5. Réponses: 3
    Dernier message: 24/02/2005, 15h48

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