我对 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/