启用 msaa x4 时如何对 SRV 进行采样?DirectX11
How to sample a SRV when enable msaa x4?DirectX11
我正在向 Introduction_to_3D_Game_Programming_with_Directx_11 学习 dx11。
没有msaa一切正常。当我启用它时,我的 .fx 和 C++ 代码将无法正常工作。
有没有人遇到过这种情况,如何处理?
代码之前:
Texture2D gTexture1;
float4 BLEND_PS(VertexOut_SV pin) :SV_TARGET
{
float4 texColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
texColor = gTexture1.Sample(SamAnisotropic, pin.Tex);
return texColor;
}
因为我无法将用msaa创建的纹理绑定到一个texture2D,所以我每次都打开msaa。
代码后:
Texture2DMS<float4> gTexture1;
float4 BLEND_PS(VertexOut_SV pin) :SV_TARGET
{
float4 texColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
texColor = gTexture1.Load(int2(pin.Tex.x*1400, pin.Tex.y*900), 0);
return texColor;
}
但是 texColor 不是正确的像素我 want.How 无法使用 msaa 对 SRV 进行采样?
如何将不带msaa的无人机改装成带msaa的SRV?
以及如何在对应hlsl代码的C++游戏代码中启用和禁用msaa?
我必须为彼此保留不同的 hlsl 吗?
要使用 'standard' MSAA,请执行以下操作:
创建交换链和渲染目标视图时,将 DXGI_SWAP_CHAIN_DESC.SampleDesc.Count
或 DXGI_SWAP_CHAIN_DESC1.SampleDesc.Count
设置为 2、4、8 等
创建深度 buffer/stencil 时,您需要为 D3D11_TEXTURE2D_DESC.SampleDesc.Count
使用相同的样本数。
创建渲染目标视图时,您需要使用 D3D11_RTV_DIMENSION_TEXTURE2DMS
(或为视图描述传递 nullptr
,以便它与资源完全匹配)
创建深度 buffer/stencil 视图时,您需要使用 D3D11_DSV_DIMENSION_TEXTURE2DMS
(或为视图描述传递 nullptr
,以便它与资源完全匹配)
渲染时需要使用光栅化器状态D3D11_RASTERIZER_DESC.MultisampleEnable
设置为TRUE。
另见 Simple rendering tutorial for DirectX Tool Kit
样本数
根据 Direct3D 功能级别,特定渲染目标格式需要一些 MSAA 样本计数。使用可以使用 CheckFormatSupport
来验证渲染目标格式是否支持 MSAA:
UINT formatSupport = 0;
if (FAILED(device->CheckFormatSupport(m_backBufferFormat, &formatSupport)))
{
throw std::exception("CheckFormatSupport");
}
UINT flags = D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE
| D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET;
if ( (formatSupport & flags) != flags )
{
// error
}
然后您使用 CheckMultisampleQualityLevels
来验证样本数是否受支持。此代码查找特定格式支持的最高 MSAA 级别计数:
for (m_sampleCount = D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT;
m_sampleCount > 1; m_sampleCount--)
{
UINT levels = 0;
if (FAILED(device->CheckMultisampleQualityLevels(m_backBufferFormat,
m_sampleCount, &levels)))
continue;
if ( levels > 0)
break;
}
if (m_sampleCount < 2)
{
// error
}
You can also validate the depth/stencil format you want to use supports D3D11_FORMAT_SUPPORT_DEPTH_STENCIL | D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET
.
翻转样式模式
上述技术仅适用于较旧的 "bit-blt" 样式翻转模式 DXGI_SWAP_EFFECT_DISCARD
或 DXGI_SWAP_EFFECT_SEQUENTIAL
。对于 UWP 和 DirectX 12,您需要使用 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
或 DXGI_SWAP_EFFECT_FLIP_DISCARD
,如果您尝试创建 SampleCount > 1 的后台缓冲区,这将失败。
在本例中,您创建了 SampleCount 为 1 的后备缓冲区,并创建了您自己的 MSAA 渲染目标 2D 纹理。您将渲染目标视图指向您的 MSAA 渲染目标,并且在您 Present
之前,您从 MSAA 渲染目标调用 ResolveSubresource
到后备缓冲区。这与 DXGI 为您 'behind the scenes' 使用较旧的翻盖模型所做的完全相同。
For gamma-correct rendering (aka when you use a backbuffer format ending in _SRGB
), the newer flip styles require that you use the non-SRGB equivalent for the backbuffer format or the swapchain create will fail. You set the SRGB format on the render target view instead.
我正在向 Introduction_to_3D_Game_Programming_with_Directx_11 学习 dx11。 没有msaa一切正常。当我启用它时,我的 .fx 和 C++ 代码将无法正常工作。 有没有人遇到过这种情况,如何处理?
代码之前:
Texture2D gTexture1;
float4 BLEND_PS(VertexOut_SV pin) :SV_TARGET
{
float4 texColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
texColor = gTexture1.Sample(SamAnisotropic, pin.Tex);
return texColor;
}
因为我无法将用msaa创建的纹理绑定到一个texture2D,所以我每次都打开msaa。
代码后:
Texture2DMS<float4> gTexture1;
float4 BLEND_PS(VertexOut_SV pin) :SV_TARGET
{
float4 texColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
texColor = gTexture1.Load(int2(pin.Tex.x*1400, pin.Tex.y*900), 0);
return texColor;
}
但是 texColor 不是正确的像素我 want.How 无法使用 msaa 对 SRV 进行采样? 如何将不带msaa的无人机改装成带msaa的SRV?
以及如何在对应hlsl代码的C++游戏代码中启用和禁用msaa? 我必须为彼此保留不同的 hlsl 吗?
要使用 'standard' MSAA,请执行以下操作:
创建交换链和渲染目标视图时,将
DXGI_SWAP_CHAIN_DESC.SampleDesc.Count
或DXGI_SWAP_CHAIN_DESC1.SampleDesc.Count
设置为 2、4、8 等创建深度 buffer/stencil 时,您需要为
D3D11_TEXTURE2D_DESC.SampleDesc.Count
使用相同的样本数。创建渲染目标视图时,您需要使用
D3D11_RTV_DIMENSION_TEXTURE2DMS
(或为视图描述传递nullptr
,以便它与资源完全匹配)创建深度 buffer/stencil 视图时,您需要使用
D3D11_DSV_DIMENSION_TEXTURE2DMS
(或为视图描述传递nullptr
,以便它与资源完全匹配)渲染时需要使用光栅化器状态
D3D11_RASTERIZER_DESC.MultisampleEnable
设置为TRUE。
另见 Simple rendering tutorial for DirectX Tool Kit
样本数
根据 Direct3D 功能级别,特定渲染目标格式需要一些 MSAA 样本计数。使用可以使用 CheckFormatSupport
来验证渲染目标格式是否支持 MSAA:
UINT formatSupport = 0;
if (FAILED(device->CheckFormatSupport(m_backBufferFormat, &formatSupport)))
{
throw std::exception("CheckFormatSupport");
}
UINT flags = D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE
| D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET;
if ( (formatSupport & flags) != flags )
{
// error
}
然后您使用 CheckMultisampleQualityLevels
来验证样本数是否受支持。此代码查找特定格式支持的最高 MSAA 级别计数:
for (m_sampleCount = D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT;
m_sampleCount > 1; m_sampleCount--)
{
UINT levels = 0;
if (FAILED(device->CheckMultisampleQualityLevels(m_backBufferFormat,
m_sampleCount, &levels)))
continue;
if ( levels > 0)
break;
}
if (m_sampleCount < 2)
{
// error
}
You can also validate the depth/stencil format you want to use supports
D3D11_FORMAT_SUPPORT_DEPTH_STENCIL | D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET
.
翻转样式模式
上述技术仅适用于较旧的 "bit-blt" 样式翻转模式 DXGI_SWAP_EFFECT_DISCARD
或 DXGI_SWAP_EFFECT_SEQUENTIAL
。对于 UWP 和 DirectX 12,您需要使用 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
或 DXGI_SWAP_EFFECT_FLIP_DISCARD
,如果您尝试创建 SampleCount > 1 的后台缓冲区,这将失败。
在本例中,您创建了 SampleCount 为 1 的后备缓冲区,并创建了您自己的 MSAA 渲染目标 2D 纹理。您将渲染目标视图指向您的 MSAA 渲染目标,并且在您 Present
之前,您从 MSAA 渲染目标调用 ResolveSubresource
到后备缓冲区。这与 DXGI 为您 'behind the scenes' 使用较旧的翻盖模型所做的完全相同。
For gamma-correct rendering (aka when you use a backbuffer format ending in
_SRGB
), the newer flip styles require that you use the non-SRGB equivalent for the backbuffer format or the swapchain create will fail. You set the SRGB format on the render target view instead.