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