我正在学习“使用 DirectX 12 进行 3D 游戏编程的介绍”。在初始化 d3d(第 4 章)中运行示例代码,当我想使用 4xmsaa 时,发生了错误,如下图,请帮助我。 错误的数字
1 回答
为了与 DirectX 12 的“无魔法运行时行为”设计理念保持一致,您不得将后缓冲区创建为 MSAA。这是因为视频输出硬件实际上不能提供 MSAA 后备缓冲区,因此必须在管道中的某个点将它们解析为每个像素。在 DirectX 11 中,当您创建 MSAA 后备缓冲区时,这是在“幕后”完成的。在 DirectX 12 中,您负责自己创建 MSAA 渲染目标纹理,然后执行对后台缓冲区的解析 - 或 - 运行其他一些执行解析的后处理。设置完全相同,只是更加详细和明确,并且在应用程序控制下,而不是“魔术”。
请参阅SimpleMSAA12示例。
使用 DirectX 12,您也不能创建 sRGB 格式的后缓冲区。您可以创建 sRGB 渲染目标视图,该视图将在写入后台缓冲区时执行 gamma。在将 sRGB MSAA 渲染目标直接解析为非 sRGB 后台缓冲区时,较旧的调试层和 Windows 10 运行时存在一些错误。这些也在上面的示例中注明。
请注意,UWP 应用与 DirectX 12 for Win32 桌面应用的行为完全相同。这是因为 UWP 应用和 DirectX 12 都需要使用
DXGI_SWAP_EFFECT_FLIP_*
交换效果而不是旧的DXGI_SWAP_EFFECT_*
交换模式。
顺便说一句,如果您启用了 DXGI 调试,当您尝试创建 4x MSAA 后备缓冲区时,您会得到一些特定的调试诊断输出:
DXGI ERROR: IDXGIFactory::CreateSwapChain: Flip model swapchains (
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
and DXGI_SWAP_EFFECT_FLIP_DISCARD) do not support multisampling.
[ MISCELLANEOUS ERROR #102: ]
查看这篇博文,了解在项目中启用 DXGI 调试的详细信息,或者查看DeviceResources的实现。