我只是在学习“使用DirectX 12进行3D游戏编程介绍”。在初始化d3d(第4章)中运行示例代码时,当我想使用4xmsaa时,发生了某些错误,请如下图所示,请帮助我。 wrong figure
答案 0 :(得分:1)
与DirectX 12的“无魔术运行时行为”的设计哲学保持一致,不允许您将后缓冲区创建为MSAA。这是因为视频输出硬件实际上不能提供MSAA后缓冲,因此必须在管道中的某些点将它们解析为单个像素。在DirectX 11中,这是在创建MSAA后备缓冲区时“在幕后”完成的。在DirectX 12中,您负责自己创建MSAA渲染目标纹理,然后对后缓冲区执行解析-或运行其他执行解析的后处理。设置完全相同,只是更加冗长和明确,并且在应用程序控制之下,而不是“魔术”。
请参见SimpleMSAA12示例。
使用DirectX 12时,也不允许创建sRGB格式的后备缓冲区。您可以创建sRGB渲染目标视图,该视图将在写入后缓冲区时执行伽玛。将sRGB MSAA渲染目标直接解析为非sRGB后备缓冲区时,较早的调试层和Windows 10运行时存在一些错误。上面的示例中也提到了这些。
请注意,UWP应用程序的行为与Win32桌面应用程序的DirectX 12完全相同。这是因为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: ]
请查看this blog post,以获取有关在项目中启用DXGI调试的详细信息,或查看DeviceResources的实现。