2

我对 DirectX 10 中的抗锯齿需要完成的过程感到困惑。我以前根本没有做过,所以可能只是我对一般过程感到困惑。

这是我到目前为止所知道的(或认为我知道的):您需要为在着色器中使用的 RasterizerState 对象启用多重采样,并且交换链描述 (DXGI_SWAP_CHAIN_DESC) 中的 SampleDesc 需要设置为支持的值计数(并且质量应该保持为 0,因为其他值或特定于硬件 - 尽管我不知道为什么)。在准备更多绘图的调用(ClearRenderTargetView 和 IASetInputLayout)和对 Present 的调用之间,后缓冲区应该被下采样(通过 ResolveSubresource)到一个其他大小相等的纹理。然后,(这是我找不到任何东西的部分)以某种方式呈现下采样纹理。

一路上我是不是有什么事情搞砸了?还是我只是在最后一步弄错了?我看到一些资源指的是在最后一次绘制到具有多重采样着色器纹理(Texture2DMS<>)的全屏四边形期间执行采样分辨率,但无法弄清楚这会带来什么,或者你为什么要这样做设备调用只是以这种方式解决它。

我在这方面所做的任何尝试都不会提高图像质量。

4

1 回答 1

5

编辑:我使用的是 DX11,您只需使用 D3D10_ 而不是 D3D11_,感谢 DeadMG。

您无需进行任何下采样。

了解您的 GPU 支持哪种质量模式和样本数。你说质量等级应该是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<>。

于 2011-07-24T10:06:00.773 回答