C++ Windows 7上DirectX 9应用程序中的多采样

C++ Windows 7上DirectX 9应用程序中的多采样,c++,directx,C++,Directx,在一个应用程序中,我尝试在一些简单的2D几何体上使用多重采样进行抗锯齿。它最初是在Windows XP上开发的,在那里我可以为我的DirectX设备和任何其他交换链启用多采样。现在,在Windows7上,多采样功能似乎根本不起作用 我提取了一个非常简短的示例代码,它只显示一个三角形。当我在Windows XP上运行该程序时,边缘是抗锯齿的,但在Windows 7上不是 void testDX() { struct CustomVertex { FLOAT x, y, z,

在一个应用程序中,我尝试在一些简单的2D几何体上使用多重采样进行抗锯齿。它最初是在Windows XP上开发的,在那里我可以为我的DirectX设备和任何其他交换链启用多采样。现在,在Windows7上,多采样功能似乎根本不起作用

我提取了一个非常简短的示例代码,它只显示一个三角形。当我在Windows XP上运行该程序时,边缘是抗锯齿的,但在Windows 7上不是

void testDX() {
    struct CustomVertex {
        FLOAT x, y, z, rhw;
        DWORD color;
    };

    CustomVertex vertices[] = {
        {0.0f, 0.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0),},
        {700.0f, 500.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0),},
        {0.0f, 500.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0),},
    };

    HRESULT hr;
    DXWindow window;
    window.New(GetDesktopWindow(), "Main Window", 0, 0, 800, 600);

    IDirect3D9Ptr d3d = Direct3DCreate9(D3D_SDK_VERSION);

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof d3dpp);
    d3dpp.Flags                     = (D3DPRESENTFLAG_VIDEO | D3DPRESENTFLAG_DEVICECLIP) & ~D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
    d3dpp.Windowed                  = TRUE;
    d3dpp.hDeviceWindow             = window.GetHandle();
    d3dpp.BackBufferWidth           = 800;
    d3dpp.BackBufferHeight          = 600;
    d3dpp.SwapEffect                = D3DSWAPEFFECT_DISCARD;
    d3dpp.MultiSampleType           = D3DMULTISAMPLE_NONMASKABLE;
    d3dpp.MultiSampleQuality        = 7;
    d3dpp.PresentationInterval      = D3DPRESENT_INTERVAL_IMMEDIATE;
    //d3dpp.BackBufferFormat        = m_d3ddm.Format;
    d3dpp.BackBufferCount           = 0;
    //d3dpp.EnableAutoDepthStencil  = TRUE;
    //d3dpp.AutoDepthStencilFormat  = D3DFMT_D16; // D3DFMT_D24X8;

    IDirect3DDevice9Ptr device; 
    hr = d3d->CreateDevice(0, D3DDEVTYPE_HAL, window.GetHandle(), D3DCREATE_FPU_PRESERVE | D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &device);

    IDirect3DSwapChain9Ptr swapChain;
    hr = device->GetSwapChain(0, &swapChain);

    hr = device->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);

    while (!window.ShouldQuit()) {
        Sleep(50);

        IDirect3DSurface9Ptr targetSurface;
        hr = swapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &targetSurface);
        hr = device->SetRenderTarget(0, targetSurface);

        hr = device->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 0, 0, 0), 1.0f, 0);
        hr = device->BeginScene();

        hr = device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 1, vertices, sizeof CustomVertex);

        hr = device->EndScene();
        hr = swapChain->Present(0, 0, (HWND)0, 0, D3DPRESENT_DONOTWAIT);
    }
}
我尝试将代码与Microsoft随DirectX SDK提供的AntiAlias示例进行比较。虽然抗锯齿效果在示例代码中起作用,但我找不到任何显著差异(不过,程序流程不是很直观)


我的问题是,为什么通过多重采样消除混叠在Windows XP上有效而在Windows 7上无效?我可以做些什么来解决这个问题?

删除D3DPRESENTFLAG\u视频有助于在Windows 7上启用多重采样。添加它是因为应用程序使用DirectX显示视频。但由于该标志没有很好的文档记录,似乎只是视频驱动程序的提示,我不知道设置或不设置该标志有哪些副作用。它没有其他明显的效果,但可能有我不知道的性能损失。

是的,我检查过了。似乎解决方案是从标志中删除D3DPRESENTFLAG_视频。不幸的是,这个标志并没有很好的文档记录,所以我不知道这会有什么其他影响。但显然,它在某种程度上阻止了Windows7上的多重采样。