我正在编写基于Vulkan API的渲染器。目前,我正在尝试为颜色附件添加MSAA。我很确定可以使用VK_SAMPLE_COUNT_16_BIT
,但 limits.framebufferColorSampleCounts
返回的位标志允许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是否可能不会“真正”支持超过x8 MSAA,但驱动程序会通过诸如超级采样之类的东西对其进行仿真?
更新
本页说明了OpenGL的MSAA实现的整体状态,实际上,从中可以很清楚地看出为什么Vulkan在我的卡上提供的x8示例不多。要点是:
某些NVIDIA驱动程序支持多重采样模式,这些模式在内部实现为多重采样和自动超级采样的组合,以获得比硬件直接支持更高的抗锯齿级别。
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卡,而不是集成卡。
我正在应用程序中使用CUDA和更多NVIDIA API在专用的100%上运行。因此,我无法在这里使用英特尔卡。
在这里,作者将该标志视为与常规整数值一样对待: github.com/SaschaWillems/Vulkan/blob/master/examples/…
我实际上是对待一个整数值吗?我在需要的地方使用了VkSampleCountFlags,除非我错过了一个地方。
@SaschaWillems也许OP指的是这个断言:
assert((deviceProperties.limits.framebufferColorSampleCounts >= sampleCount) && (deviceProperties.limits.framebufferDepthSampleCounts >= sampleCount));
。