Мультисэмплинг в приложении DirectX 9 в Windows 7

#c #directx

#c #directx

Вопрос:

В приложении я пытаюсь использовать мультисэмплинг для сглаживания некоторой простой 2D-геометрии. Изначально он был разработан на Windows XP, где у меня не возникло проблем с включением мультисэмплинга для моего устройства DirectX и для любых дополнительных цепочек подкачки. Теперь в Windows 7 функция мультисэмплинга, похоже, вообще не работает.

Я извлек очень короткий пример кода, который ничего не делает, кроме отображения треугольника. Когда я запускаю программу в Windows XP, edge сглаживается, но в 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(amp;d3dpp, sizeof d3dpp);
    d3dpp.Flags                     = (D3DPRESENTFLAG_VIDEO | D3DPRESENTFLAG_DEVICECLIP) amp; ~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, amp;d3dpp, amp;device);

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

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

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

        IDirect3DSurface9Ptr targetSurface;
        hr = swapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, amp;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);
    }
}
  

Я попытался сравнить код с образцом AntiAlias, который Microsoft поставляет вместе со своим DirectX SDK. И хотя эффект сглаживания работает в примере кода, я не смог найти какой-либо существенной разницы (однако программный процесс не очень интуитивно понятен).

Мой вопрос в том, почему сглаживание с помощью мультисэмплинга работает в Windows XP, но не в Windows 7, и что я могу сделать, чтобы это исправить?

Комментарии:

1. Да, я это проверил. Кажется, решение состояло в том, чтобы удалить D3DPRESENTFLAG_VIDEO из флагов. К сожалению, этот флаг не очень хорошо документирован, поэтому я не знаю, какие другие эффекты это могло бы иметь. Но, очевидно, это каким-то образом предотвращает мультисэмплинг в Windows 7.

Ответ №1:

Удаление D3DPRESENTFLAG_VIDEO помогло включить мультисэмплинг в Windows 7. Это было добавлено, потому что приложение использует DirectX для отображения видео. Но поскольку флаг не очень хорошо документирован и, похоже, является лишь подсказкой для видеодрайвера, я не знаю, какие побочные эффекты имеет установка или не установка флага. Это не имеет другого очевидного эффекта, но, возможно, есть снижение производительности, о котором я не знаю.