我正在从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时都会使用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?
以及如何在C++游戏代码中启用和禁用具有相应hlsl代码的msaa?我一定要为对方保留不同的房间吗?
发布于 2016-10-28 16:37:00
对于“标准”MSAA的使用,您可以执行以下操作:
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。还请参阅简单渲染教程中的DirectX工具包
样本计数
根据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
的深度/模板格式。
翻转式模式
上述技术只适用于较旧的“位-blt”风格的翻转模式DXGI_SWAP_EFFECT_DISCARD
或DXGI_SWAP_EFFECT_SEQUENTIAL
。对于UWP和DirectX 12,您需要使用DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
或DXGI_SWAP_EFFECT_FLIP_DISCARD
,如果尝试创建一个SampleCount > 1的back缓冲区,则会失败。
在本例中,您使用SampleCount值为1创建后台缓冲区,并创建自己的MSAA呈现目标2D纹理。您的呈现目标视图指向您的MSAA呈现目标,在Present
之前,您可以从MSAA呈现目标到后台缓冲区调用ResolveSubresource
。这和DXGI在旧的翻盖模型“幕后”为你做的完全一样。
对于伽马正确的呈现(也就是当您使用以
_SRGB
结尾的回缓冲格式时),较新的翻转样式要求您使用与后台缓冲区格式等效的非SRGB格式,否则空白链创建将失败。您可以在呈现目标视图上设置SRGB格式。
https://stackoverflow.com/questions/40275577
复制相似问题