Clipplans, vertex shaders, and vertex hardware in Direct3D 9

I have a problem with clips in my application that I can play in the example from the DirectX SDK (February 2010).

I added the clip to the HLSLwithoutEffects sample:

...
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 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 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() );
    }
}

When I rotate the camera, I have different visual results when using hardware and software vertex processing. In the vertex processing mode of the software or when using the reference device, the clipping plane works normally as expected. In hardware mode, it rotates with the camera.

If I remove the call to RenderText (); from OnFrameRender then hardware rendering also works great. Further debugging shows that the problem is ID3DXFont :: DrawText.

Windows Vista Windows 7, Windows XP. NVidia ATI . DirectX? ?

+3
1

, , - RenderText . "" , .

, DrawIndexedPrimitive.

0

Source: https://habr.com/ru/post/1749861/


All Articles