火山 API:支持的最大 MSAA 样本为 VK_SAMPLE_COUNT_8_BIT

Vulkan API : max MSAA samples supported is VK_SAMPLE_COUNT_8_BIT

我正在编写基于 Vulkan API 的渲染器。目前我正在尝试为颜色附件添加 MSAA。 我很确定我可以使用 VK_SAMPLE_COUNT_16_BIT ,但是 limits.framebufferColorSampleCounts returns 位标志允许 MSAA 级别高达 VK_SAMPLE_COUNT_8_BIT(含)

我 运行 在全新的 NVIDIA QUADRO RTX 3000 卡上。我还使用最新的 NVIDIA 驱动程序:441.28 我检查了 OpenGL 和 GPU 上限查看器显示的限制

GL_MAX_FRAMEBUFFER_SAMPLES = 32

这有什么意义?限制仅由 Vulkan API 规定吗?如果硬件不支持超过 x8 那么这是否意味着 OpenGL 驱动程序在 CPU 上模拟它,例如通过超级采样之类的东西? khronosdev.slack 的几位渲染开发人员就是这么说的?是否有意义?供应商是否必须按照标准进行编译并以正确的方式实施 MSAA 或根本不实施?

有没有可能 OpenGL 不 "really" 支持超过 x8 MSAA,但驱动程序通过超级采样之类的东西模拟它?

更新

This page 解释了 OpenGL 的 MSAA 实现的整个状态,实际上从中可以清楚地看出为什么 Vulkan 没有在我的卡上提供超过 x8 的样本。这是妙语:

Some NVIDIA drivers support multisample modes which are internally implemented as a combination of multisampling and automatic supersampling in order to obtain a higher level of anti-aliasing than can be directly supported by hardware.

framebufferColorSampleCounts 是标志,不是计数。请参阅此枚举以获取值:https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkSampleCountFlagBits.html

15 个报价 VK_SAMPLE_COUNT_1_BITVK_SAMPLE_COUNT_2_BITVK_SAMPLE_COUNT_4_BITVK_SAMPLE_COUNT_8_BIT

这回答了为什么你得到 15,而不是 2 的幂,但它仍然回避了为什么 NVidia 驱动程序比 OpenGL 驱动程序对你的限制更多。也许是 NVidia 论坛的问题。您应该仔细检查您的驱动程序是否是最新的,并且您实际上选择的是 NVidia 卡而不是集成卡。

我也遇到过类似的问题(不是 Vulkan,而是 OpenGL,还有 NVidia):在我的 NVidia GeForce GTX 750 Ti 上,Linux 驱动程序 nvidia 报告 GL_MAX_SAMPLES=32,但任何高于 8 个样本都会导致所有内容变得丑陋模糊,包括例如文本,即使所有渲染都使用 glDisable(GL_MULTISAMPLING)

我记得在全局启用 FXAA(通过 nvidia-settings --assign=fxaa=1)和启用此设置的 运行 KWin(KDE 的合成 window 管理器)时看到了同样的模糊问题。所以我怀疑 samples>=9 的这种行为是因为除了(或代替)MSAA,驱动程序还启用了 FXAA。