Direct3D 9中的Clipplanes,顶点着色器和硬件顶点处理

时间:2010-06-13 23:27:11

标签: direct3d direct3d9

我的应用程序中存在clipplanes的问题,我可以在DirectX SDK的示例中重现(2010年2月)。

我在HLSLwithoutEffects示例中添加了一个clipplane:

...
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中没有。我在不同PC上的所有三个操作系统中使用最新的NVidia和ATI驱动程序测试了代码。 这是一个DirectX问题吗?或不正确使用clipplanes?

由于

伊戈尔

1 个答案:

答案 0 :(得分:0)

这表明RenderText中的某些内容正在改变剪裁平面。它可能是一个伤害你的驱动程序“优化”。

考虑在执行DrawIndexedPrimitive之前立即设置剪裁平面。