2010-06-13 8 views
3

У меня проблема с клипами в приложении, которые я могу воспроизвести в образце из 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? Или неправильное использование клипов?

Благодаря

Игорь

ответ

0

Ну что наводит на мысль, что что-то в RenderText меняет плоскость отсечения. Это может быть «оптимизация» водителя, которая причиняет вам боль.

Рассмотрите возможность установки плоскости клипа непосредственно перед выполнением DrawIndexedPrimitive.

 Смежные вопросы

  • Нет связанных вопросов^_^