2010-06-13 19 views
3

J'ai un problème avec les clipplanes dans mon application que je peux reproduire dans un échantillon de DirectX SDK (février 2010).Clipplanes, vertex shaders et traitement de vertex matériel dans Direct3D 9

J'ai ajouté un clipplane à l'échantillon de HLSLwithoutEffects:

... 
D3DXPLANE g_Plane(0.0f, 1.0f, 0.0f, 0.0f); 
... 

void SetupClipPlane(const D3DXMATRIXA16 & view, const D3DXMATRIXA16 & proj) 
{ 
    D3DXMATRIXA16 m = view * proj; 
    D3DXMatrixInverse(&m, NULL, &m); 
    D3DXMatrixTranspose(&m, &m); 

    D3DXPLANE plane; 
    D3DXPlaneNormalize(&plane, &g_Plane); 

    D3DXPLANE clipSpacePlane; 
    D3DXPlaneTransform(&clipSpacePlane, &plane, &m); 

    DXUTGetD3D9Device()->SetClipPlane(0, clipSpacePlane); 
} 

void CALLBACK OnFrameMove(double fTime, float fElapsedTime, void* pUserContext) 
{ 
    // Update the camera's position based on user input 
    g_Camera.FrameMove(fElapsedTime); 

    // Set up the vertex shader constants 
    D3DXMATRIXA16 mWorldViewProj; 
    D3DXMATRIXA16 mWorld; 
    D3DXMATRIXA16 mView; 
    D3DXMATRIXA16 mProj; 

    mWorld = *g_Camera.GetWorldMatrix(); 
    mView = *g_Camera.GetViewMatrix(); 
    mProj = *g_Camera.GetProjMatrix(); 

    mWorldViewProj = mWorld * mView * mProj; 

    g_pConstantTable->SetMatrix(DXUTGetD3D9Device(), "mWorldViewProj", &mWorldViewProj); 
    g_pConstantTable->SetFloat(DXUTGetD3D9Device(), "fTime", (float)fTime); 

    SetupClipPlane(mView, mProj); 
} 

void CALLBACK OnFrameRender(IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext) 
{ 
    // If the settings dialog is being shown, then 
    // render it instead of rendering the app's scene 
    if(g_SettingsDlg.IsActive()) 
    { 
     g_SettingsDlg.OnRender(fElapsedTime); 
     return; 
    } 

    HRESULT hr; 

    // Clear the render target and the zbuffer 
    V(pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0)); 

    // Render the scene 
    if(SUCCEEDED(pd3dDevice->BeginScene())) 
    { 
     pd3dDevice->SetVertexDeclaration(g_pVertexDeclaration); 
     pd3dDevice->SetVertexShader(g_pVertexShader); 
     pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(D3DXVECTOR2)); 
     pd3dDevice->SetIndices(g_pIB); 

     pd3dDevice->SetRenderState(D3DRS_CLIPPLANEENABLE, D3DCLIPPLANE0); 
     V(pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, g_dwNumVertices, 
              0, g_dwNumIndices/3)); 
     pd3dDevice->SetRenderState(D3DRS_CLIPPLANEENABLE, 0); 

     RenderText(); 
     V(g_HUD.OnRender(fElapsedTime)); 

     V(pd3dDevice->EndScene()); 
    } 
} 

Quand je tourner la caméra j'ai des résultats différents visuels lors de l'utilisation de traitement de vertex matériel et logiciel. En mode de traitement de vertex logiciel ou lors de l'utilisation du périphérique de référence, le plan de découpe fonctionne correctement comme prévu. En mode matériel, il semble tourner avec l'appareil photo.

Si je supprime l'appel à RenderText(); de OnFrameRender puis le rendu matériel fonctionne également très bien. Un débogage supplémentaire révèle que le problème est dans ID3DXFont :: DrawText.

J'ai ce problème dans Windows Vista et Windows 7 mais pas dans Windows XP. J'ai testé le code avec les derniers pilotes NVidia et ATI dans les trois systèmes d'exploitation sur différents PC. S'agit-il d'un problème avec DirectX? Ou l'utilisation incorrecte des clipplanes?

Merci

Igor

Répondre

0

bien qui suggère que quelque chose dans renderText est en train de changer le plan du clip. Il pourrait bien s'agir d'une «optimisation» du pilote qui vous fait mal.

Envisagez simplement de définir le plan du plan immédiatement avant d'exécuter DrawIndexedPrimitive.