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 :

probleme avec le stencil buffer


Sujet :

DirectX

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 74
    Points : 31
    Points
    31
    Par défaut probleme avec le stencil buffer
    désolé, c'est encore moi

    après ces deux problèmes vous n'entendrez plus parler de moi promis lol

    bon, je suis entrain d'implémenter les reflet grace au stencil buffer dans mon moteur. Pour ça je me suis aidé de l'exemple du sdk... mais une fois de plus et après de longues crises de nerf je n'obtient pas l'effet désiré.

    Pour l'instant les objets que je souhaite refleter apparaisse "en entier"
    ( sans que le mask du stencil buffer n'ai d'influence )

    Y a t-il une initialisation particulière à faire ? En fait je ne comprend pas très bien cette technique, impossible donc de trouver l'erreur...

    initialisation de l'app :

    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
     
    HRESULT InitD3D( HWND hWnd )
    {
        // Create the D3D object.
        if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
            return E_FAIL;
     
        // Get the current desktop display mode, so we can set up a back
        // buffer of the same format
        D3DDISPLAYMODE d3ddm;
        if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
            return E_FAIL;
     
        // Set up the structure used to create the D3DDevice. Since we are now
        // using more complex geometry, we will create a device with a zbuffer.
        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; 
        d3dpp.BackBufferHeight = 768; 
        d3dpp.BackBufferWidth = 1024; 
        //d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_ONE; 
     
        // Create the D3DDevice
        if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                          D3DCREATE_HARDWARE_VERTEXPROCESSING,
                                          &d3dpp, &g_pd3dDevice ) ) )
    			return E_FAIL;
     
    }

    initialisation du v-buffer du "miroir"

    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
     
     
     
    HRESULT InitMirror()
    {
     
    	m_pMirrorVB         = NULL;
     
    	D3DXMatrixIdentity( &m_matMirrorMatrix );
     
    	// Create a big square for rendering the mirror
        if( FAILED( g_pd3dDevice->CreateVertexBuffer( 4*sizeof(MIRRORVERTEX),
                                           D3DUSAGE_WRITEONLY, D3DFVF_MIRRORVERTEX,
                                           D3DPOOL_MANAGED, &m_pMirrorVB ) ) )
            return E_FAIL;
     
        MIRRORVERTEX* v;
        m_pMirrorVB->Lock( 0, 0, (BYTE**)&v, 0 );
        v[0].p = D3DXVECTOR3(-00.0f, 0.0f,-0.0f );
        v[0].n = D3DXVECTOR3( 0.0f,  1.0f,  0.0f );
        v[1].p = D3DXVECTOR3(-00.0f, 0.0f, 0.0f );
        v[1].n = D3DXVECTOR3( 0.0f,  1.0f,  0.0f );
        v[2].p = D3DXVECTOR3( 00.0f, 0.0f,-0.0f );
        v[2].n = D3DXVECTOR3( 0.0f,  1.0f,  0.0f );
        v[3].p = D3DXVECTOR3( 00.0f, 0.0f, 0.0f );
        v[3].n = D3DXVECTOR3( 0.0f,  1.0f,  0.0f );
        m_pMirrorVB->Unlock();
     
     
    	return S_OK;
     
    }

    puis dans le render :

    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
     
     
    void RenderMirror()
    {
        // Turn depth buffer off, and stencil buffer on
        g_pd3dDevice->SetRenderState( D3DRS_STENCILENABLE, TRUE );
        g_pd3dDevice->SetRenderState( D3DRS_STENCILFUNC,     D3DCMP_ALWAYS );
        g_pd3dDevice->SetRenderState( D3DRS_STENCILREF,      0x1 );
        g_pd3dDevice->SetRenderState( D3DRS_STENCILMASK,     0xffffffff );
        g_pd3dDevice->SetRenderState( D3DRS_STENCILWRITEMASK,0xffffffff );
        g_pd3dDevice->SetRenderState( D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP );
        g_pd3dDevice->SetRenderState( D3DRS_STENCILFAIL,  D3DSTENCILOP_KEEP );
        g_pd3dDevice->SetRenderState( D3DRS_STENCILPASS,  D3DSTENCILOP_REPLACE );
     
        // Make sure no pixels are written to the z-buffer or frame buffer
        g_pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE,  FALSE );
        g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
        g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_ZERO );
        g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
     
        // Draw the reflecting surface into the stencil buffer
        g_pd3dDevice->SetTexture( 0, NULL);
        g_pd3dDevice->SetTransform( D3DTS_WORLD, &m_matMirrorMatrix );
        g_pd3dDevice->SetVertexShader( D3DFVF_MIRRORVERTEX );
        g_pd3dDevice->SetStreamSource( 0, m_pMirrorVB, sizeof(MIRRORVERTEX) );
        g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
     
        // Save the view matrix
        D3DXMATRIX matViewSaved;
        g_pd3dDevice->GetTransform( D3DTS_VIEW, &matViewSaved );
     
        // Reflect camera in X-Z plane mirror
        D3DXMATRIX matView2, matReflect;
        D3DXPLANE plane;
        D3DXPlaneFromPointNormal( &plane, &D3DXVECTOR3(0,0,0), &D3DXVECTOR3(0,1,0) );
        D3DXMatrixReflect( &matReflect, &plane );
        D3DXMatrixMultiply( &matView2, &matReflect, &matViewSaved );
        g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView2 );
     
        // Set a clip plane, so that only objects above the water are reflected
        g_pd3dDevice->SetClipPlane( 0, plane );
        g_pd3dDevice->SetRenderState( D3DRS_CLIPPLANEENABLE, 0x01 );
     
        // Setup render states to a blended render scene against mask in stencil
        // buffer. An important step here is to reverse the cull-order of the
        // polygons, since the view matrix is being relected.
        g_pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
        g_pd3dDevice->SetRenderState( D3DRS_STENCILFUNC,  D3DCMP_EQUAL );
        g_pd3dDevice->SetRenderState( D3DRS_STENCILPASS,  D3DSTENCILOP_KEEP );
        g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND,     D3DBLEND_DESTCOLOR );
        g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND,    D3DBLEND_ZERO );
        g_pd3dDevice->SetRenderState( D3DRS_CULLMODE,     D3DCULL_CW );
     
        // Clear the zbuffer (leave frame- and stencil-buffer intact)
        g_pd3dDevice->Clear( 0L, NULL, D3DCLEAR_ZBUFFER, 0L, 1.0f, 0L );
     
    	g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
     
    	if (arbres_mesh[3].visible) Afficher_Mesh( arbres_mesh[3] );
     
     
        // Restore render states
        g_pd3dDevice->SetRenderState( D3DRS_CULLMODE,         D3DCULL_CCW );
        g_pd3dDevice->SetRenderState( D3DRS_STENCILENABLE,    FALSE );
        g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
        g_pd3dDevice->SetRenderState( D3DRS_CLIPPLANEENABLE,  0x00 );
        g_pd3dDevice->SetTransform( D3DTS_VIEW, &matViewSaved );
     
     
    }
    c'est ce bout de code ( le plus important ) que je ne saisis pas très bien... notament "Draw the reflecting surface into the stencil buffer"... chez moi si je vire ce bout de code rien ne change... je dois encore oublier d'initialiser quelque chose, snif...........

    help me !!!!!!!!!!!!! please !!!!!!!!!!!!!!


  2. #2
    Membre expérimenté

    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
    Points : 1 679
    Points
    1 679
    Par défaut
    ça ne peut pas marcher parce qu'il n'y a pas d'information de stencil dans ton ZBuffer !

    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

    remplace par

    D3DFMT_D24S8

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    oui je me suis rendu compte de ce problème en me plongeant un peu dans le stencil buffer... mais mon pb c'est qu'avec le flag D3DFMT_D24S8 mon appli ne veut plus se lancer....

  4. #4
    Membre expérimenté

    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
    Points : 1 679
    Points
    1 679
    Par défaut
    peut-etre que ta carte graphique ne supporte pas le stencil buffer (si elle est antédiluvienne....)

    Quelle est la marque et le modèle de ta carte ?
    ça pète lors de la création du device ou après ?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    Merci de te pencher sur mon pb
    Non ça ne vient pas de la carte, c'est une FX5900.
    Oui ça pète lors de la création du device. Mais bon, je vais chercher de ce coté...

    Au passage : est-ce que le stencil buffer peut me permettre de simuler l'éclairage d'une torche par exemple ?

  6. #6
    Membre expérimenté

    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
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par conrad
    Au passage : est-ce que le stencil buffer peut me permettre de simuler l'éclairage d'une torche par exemple ?
    oui

  7. #7
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    me revoilà avec mon stencil buffer...

    Aujourd'hui je me suis lancé dans la gestion d'une lampe torche avec le stencil buffer. J'ai repris le code exemple du sdk sur les shadow volume et je l'ai arrangé à ma sauce... Et bien évidemment rien ( ou presque ne s'affiche ).

    Au niveau de l'init je passe le format du stencil en D2G4S8 mais faut il auusi que je modifie le backbuffer format ? ( je suis en X8R8G8B8 )

    En faisant qques tests je sais que le "shadow volume" est créé correctement et je pense donc que le pb vient du stockage dans le stencil... portant j'ai repris mot pour mot les fonctions du tuto... peut-il s'agir d'un pb de flag en contradiction avec le reste de mon code ? ( étant donné que j'ai inclu des trucs genre bump map, alpha blending, point sprites ??? )

    thx

  8. #8
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    cherchez pas, c'était les flags de l'alpha blending qui entraient en conflict... mais bon je n'ai pas encore tout résolu...

    see you later...

Discussions similaires

  1. probleme avec response.buffer
    Par olaxius dans le forum ASP
    Réponses: 3
    Dernier message: 07/07/2006, 12h24
  2. Probleme avec doskey et buffer...
    Par shaiton dans le forum C
    Réponses: 8
    Dernier message: 08/01/2006, 16h59
  3. [VB.NET] Probleme avec un buffer
    Par Aspic dans le forum VB.NET
    Réponses: 1
    Dernier message: 14/12/2005, 17h17
  4. Probleme avec le vertex buffer
    Par nicoo dans le forum DirectX
    Réponses: 12
    Dernier message: 19/10/2004, 22h45
  5. Probleme Stencil Buffer
    Par supergrey dans le forum DirectX
    Réponses: 14
    Dernier message: 20/07/2004, 21h54

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