我正在从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不是我想要的像素。如何用msaa采样SRV? 如何将没有msaa的无人机转换为带有msaa的SRV?
如何使用相应的hlsl代码在C ++游戏代码中启用和禁用msaa? 我是否必须为彼此保留不同的hlsl?
答案 0 :(得分:1)
对于&#39;标准&#39;使用MSAA,您可以执行以下操作:
创建交换链并渲染traget视图时,请将DXGI_SWAP_CHAIN_DESC.SampleDesc.Count
或DXGI_SWAP_CHAIN_DESC1.SampleDesc.Count
设置为2,4,8等
创建深度缓冲区/模板时,需要对D3D11_TEXTURE2D_DESC.SampleDesc.Count
使用相同的样本计数。
创建渲染目标视图时,您需要使用D3D11_RTV_DIMENSION_TEXTURE2DMS
(或传递nullptr
作为视图说明,以使其与资源完全匹配)
创建深度缓冲区/模板视图时,需要使用D3D11_DSV_DIMENSION_TEXTURE2DMS
(或传递nullptr
作为视图描述,以便与资源完全匹配)
渲染时,您需要使用D3D11_RASTERIZER_DESC.MultisampleEnable
设置为TRUE的光栅化器状态。
另请参阅Simple rendering
的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
}
您还可以验证要使用的深度/模板格式支持
D3D11_FORMAT_SUPPORT_DEPTH_STENCIL | D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET
。
上述技术仅适用于年龄较大的&#34; bit-blt&#34;样式翻转模式DXGI_SWAP_EFFECT_DISCARD
或DXGI_SWAP_EFFECT_SEQUENTIAL
。对于UWP和DirectX 12,您需要使用DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
或DXGI_SWAP_EFFECT_FLIP_DISCARD
,如果您尝试使用SampleCount&gt;创建后缓冲区,则会失败。 1。
在这种情况下,您使用SampleCount为1创建后备缓冲区,并创建自己的MSAA渲染目标2D纹理。您将渲染目标视图指向MSAA渲染目标,然后在Present
之前从MSAA渲染目标调用ResolveSubresource
到后退缓冲区。这与DXGI在幕后为您做的完全相同&#39;与较旧的翻盖模型。
对于正确的伽玛渲染(也就是当您使用以
_SRGB
结尾的后备缓冲格式时),较新的翻转样式要求您使用非SRGB等效的后备缓冲格式,否则交换链创建将失败。您可以在渲染目标视图上设置SRGB格式。