c++ - DirectX 10 中多重采样的操作顺序

标签 c++ directx-10

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

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

我是不是遇到了什么麻烦事?或者我只是在最后一步犯了错误?我看到一些资源提到在最后一次绘制具有多重采样着色器纹理(Texture2DMS<>)的全屏四边形时进行采样分辨率,但无法弄清楚这会带来什么,或者为什么你要重新做一遍设备调用以这种方式解决它。

我对此所做的任何尝试都不会提高图像质量。

最佳答案

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

您不需要进行任何下采样。<​​/p>

了解您的 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<>。

关于c++ - DirectX 10 中多重采样的操作顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6803947/

相关文章:

C++ 函数写得不好,不知道如何简化它[初学者]

c++ - vector 下标超出范围 - 更新方法

c++ - DXUT 配置

c++ - Direct3D Sprite 的最近邻插值?

C++ Directx鼠标输入在失去焦点后表现得很奇怪

c++ - 使用窗口大小和长输入运行中值

c++ - OpenCV 帮助 - 错误:没有运算符 "="匹配这些操作数。操作数类型是 cv::Mat = IplImage*

graphics - 实现 API 以等待 d3d10 命令完成

c++ - 使用 RotatedRect 跟踪手部旋转

c++ - 在什么情况下我应该在 C++ 中使用 memcpy 而不是标准运算符?