Порядок операций для мультисэмплинга в DirectX 10 - PullRequest
2 голосов
/ 24 июля 2011

Я запутался в процессе, который необходимо выполнить для сглаживания в DirectX 10. Раньше я вообще этого не делал, так что, возможно, я просто запутался в процедуре в целом.

Вот что я знаю до сих пор (или думаю, что знаю): вам нужно включить мультисэмплинг для вашего объекта RasterizerState, который вы используете в шейдере, и что SampleDesc в описании цепочки обмена (DXGI_SWAP_CHAIN_DESC) должен быть установлен в поддерживаемое значение для Count (и это Качество должно оставаться 0, так как другие значения или аппаратно-ориентированные - хотя я не знаю, для чего). Между вызовами для подготовки к дополнительному рисованию (ClearRenderTargetView и IASetInputLayout) и вызовом Present обратный буфер должен быть подвергнут понижающей дискретизации (через ResolveSubresource) до текстуры равного размера. Затем (это часть, в которой я ничего не могу найти) каким-то образом представить уменьшенную текстуру.

У меня что-то не так по пути? Или я просто ошибаюсь на последнем шаге? Я видел несколько ресурсов, относящихся к выполнению разрешения выборки во время одного последнего рисования для полноэкранного четырехугольника с текстурой шейдера с несколькими выборками (Texture2DMS <>), но я не могу понять, что это повлечет за собой, или почему вы будете делать это поверх вызов устройства, чтобы просто решить это таким образом.

Любая попытка сделать это не приводит к повышению качества изображения.

1 Ответ

5 голосов
/ 24 июля 2011

РЕДАКТИРОВАТЬ: Я использую DX11, вы просто используете D3D10_ вместо D3D11_, спасибо DeadMG.

Вам не нужно выполнять даунсамплинг.

Узнайте, какие режимы качества и количество образцов поддерживает ваш графический процессор. Вы сказали, что уровень качества должен быть 0, это неправильно. Используйте это, чтобы получить поддерживаемые режимы качества с количеством образцов:

UINT GetMSAAQuality(UINT numSamples,DXGI_FORMAT format)
    {
        UINT q=-1;
        HR(m_device->CheckMultisampleQualityLevels(format,numSamples,&q));
        return q-1;
    }

    // Use it like this:
    UINT sampleCount=4; // You set this
    UINT sampleQuality=GetMSAAQuality(sampleCount,DXGI_FORMAT_CHOOSE_ONE);

    // For swap chain
    DXGI_SWAP_CHAIN_DESC d;
    d.SampleDesc.Count=sampleCount;
    d.SampleDesc.Quality=sampleQuality;

        // Now for all the textures that you create for your
        // render targets and also for your depth buffer
        D3D11_TEXTURE2D_DESC dtex;
        dtex.SampleDesc.Quality=sampleQuality;
        dtex.SampleDesc.Count=sampleCount;

        // Now for all your render target views you must set the correct dimension type
        // based on if you use multisampling or not
        D3D11_RENDER_TARGET_VIEW_DESC drtv;
        dRtSwapChain.ViewDimension=sampleQuality==0?D3D11_RTV_DIMENSION_TEXTURE2D:D3D11_RTV_DIMENSION_TEXTURE2DMS;

 // For depth stencil view
D3D11_DEPTH_STENCIL_VIEW_DESC ddsv;
ddsv.ViewDimension=sampleQuality==0?D3D11_DSV_DIMENSION_TEXTURE2D:D3D11_DSV_DIMENSION_TEXTURE2DMS;

Если вы хотите прочитать многосэмплированную текстуру в своем шейдере (например, если вы отрисовываете полноэкранный квад), вы должны объявить текстуру Texture2DMS <>.

...