火山 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_BIT
、VK_SAMPLE_COUNT_2_BIT
、VK_SAMPLE_COUNT_4_BIT
或 VK_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。
我正在编写基于 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_BIT
、VK_SAMPLE_COUNT_2_BIT
、VK_SAMPLE_COUNT_4_BIT
或 VK_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。