У меня проблема с клипами в приложении, которые я могу воспроизвести в образце из DirectX SDK (февраль 2010 г.).Clipplanes, вершинные шейдеры и обработка аппаратных вершин в Direct3D 9
Я добавил clipplane к образцу 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());
}
}
Когда я вращать камеру у меня есть различные визуальные результаты при использовании аппаратного и программного обеспечения обработки вершин. В режиме обработки вершин программного обеспечения или при использовании эталонного устройства плоскость отсечения работает нормально, как ожидалось. В аппаратном режиме он вращается вместе с камерой.
Если я удалю вызов RenderText(); из OnFrameRender тогда аппаратное рендеринг также отлично работает. Дальнейшая отладка показывает, что проблема в ID3DXFont :: DrawText.
У меня эта проблема в Windows Vista и Windows 7, но не в Windows XP. Я тестировал код с последними драйверами NVidia и ATI во всех трех ОС на разных ПК. Это проблема DirectX? Или неправильное использование клипов?
Благодаря
Игорь