アンチエイリアスの巻

「ラスタライザ設定」の表示結果の対角線が汚かったのでアンチエイリアスをかけてみます。


■修正点

最適なアンチエイリアス設定を探しスワップチェインに与えるためデバイス作成を先に行っておきます。

    //デバイスの生成
    for (int driverTypesIndex=0;driverTypesIndex<driverTypeNum;++driverTypesIndex)
    {
        driverType = driverTypes[driverTypesIndex];

        hr = D3D11CreateDevice( NULL,
                                driverType,
                                NULL,
                                createDeviceFlag,
                                featureLevels,
                                featureLevelNum,
                                D3D11_SDK_VERSION,
                                &pDevice,
                                &featureLevel,
                                &pDeviceContext);

        if (SUCCEEDED(hr)) break;

    }

    if (FAILED(hr))
    {
        printf("failed D3D11CreateDevice\n");
        return 0;
    }

    //インタフェースをクエリ
    IDXGIDevice1* pDxgi = NULL;
    hr = pDevice->QueryInterface(__uuidof(IDXGIDevice1), (void**)&pDxgi);
    if (FAILED(hr))
    {
        printf("failed QueryInterface\n");
        return 0;
    }

    // Dxgiからアダプタを取得
    IDXGIAdapter* pAdapter = NULL;
    hr = pDxgi->GetAdapter(&pAdapter);
    if (FAILED(hr))
    {
        printf("failed GetAdapter\n");
        return 0;
    }

    // アダプタからファクトリを取得
    IDXGIFactory* pDxgiFactory = NULL;
    pAdapter->GetParent(__uuidof(IDXGIFactory), (void**)&pDxgiFactory);
    if (pDxgiFactory == NULL)
    {
        printf("failed GetAdapter\n");
        return 0;
    }

    //----------------------------------
    // アンチエイリアス設定
    //----------------------------------
    DXGI_SAMPLE_DESC sampleDesc;
    for (int cnt=0;cnt<=D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT;++cnt)
    {
        UINT quality;   

        hr = pDevice->CheckMultisampleQualityLevels(DXGI_FORMAT_D24_UNORM_S8_UINT, cnt, &quality);

        if (SUCCEEDED(hr))
        {
            if (0 < quality)
            {
                sampleDesc.Count   = cnt;
                sampleDesc.Quality = quality - 1;
            }
        }
    }

    // スワップチェインパラメータ設定
    DXGI_SWAP_CHAIN_DESC sd;
    ZeroMemory(&sd,sizeof(sd));
    sd.BufferCount= 1;
    sd.BufferDesc.Width = WINDOW_WIDTH;
    sd.BufferDesc.Height = WINDOW_HEIGHT;
    sd.BufferDesc.RefreshRate.Numerator = 60;
    sd.BufferDesc.RefreshRate.Denominator = 1;
    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    sd.OutputWindow = hWnd;
    sd.SampleDesc = sampleDesc;
    sd.Windowed= TRUE;
    sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
    sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;

    // スワップチェイン作成
    hr = pDxgiFactory->CreateSwapChain(pDevice, &sd, &pSwapChain);
    
    if (FAILED(hr))
    {
        printf("failed createSwapChain\n");
        return 0;
    }


■結果

■感想
こ、これは・・・わかりにくいw
若干滑らかさが加わっているようなうぬぬ。
サンプルとしては最悪の結果になってしまったかも。


■参考サイト

◇DirectX11プログラミング -MSAAを有効にする-
http://yun.cup.com/directx11029.html

Nanashi-softさんにはいつもお世話になっております。
ありがとうございます!