我是否需要将VkAttachmentDescription::samples
2的幂设置为2,还是允许任意值,只要它们不超过硬件支持的最大值?
我对此很困惑。该samples
字段的类型VkSampleCountFlagBits
为,通过以下方式声明
typedef enum VkSampleCountFlagBits {
VK_SAMPLE_COUNT_1_BIT = 0x00000001,
VK_SAMPLE_COUNT_2_BIT = 0x00000002,
VK_SAMPLE_COUNT_4_BIT = 0x00000004,
VK_SAMPLE_COUNT_8_BIT = 0x00000008,
VK_SAMPLE_COUNT_16_BIT = 0x00000010,
VK_SAMPLE_COUNT_32_BIT = 0x00000020,
VK_SAMPLE_COUNT_64_BIT = 0x00000040,
VK_SAMPLE_COUNT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkSampleCountFlagBits;
另一方面,该VkPhysicalDeviceLimits
struct包含字段framebufferColorSampleCounts
and和framebufferDepthSampleCounts
,它们是类型的VkSampleCountFlags
,而这些字段又仅仅是typedef
for uint32_t
。
多重采样的vulkan教程页面确定了这些字段中的最高位,以计算最大可用采样数。我实际上不明白这一点。例如,如果VK_SAMPLE_COUNT_16_BIT
并且VK_SAMPLE_COUNT_1_BIT
都在这些字段中都设置了该怎么办?这是否意味着最大可用采样数至少为17?
我需要的是,给定一个在一天结束时做什么uint32_t requested_sampled_count
,确定是否requested_sampled_count
是一个可能值VkAttachmentDescription::samples
的两种颜色和深度附着物,如果不是的话,还有什么比小的最高可能值requested_sampled_count
。
假设我std::uint32_t sample_count
从物理设备属性中给出了and,VkSampleCountFlags framebuffer_color_sample_counts
并想要计算VkSampleCountFlagBits samples
。我是否需要以下方式?
if (sample_count > 64)
/* error */;
if (sample_count > 32)
samples = VK_SAMPLE_COUNT_32_BIT;
else if (sample_count > 16)
samples = VK_SAMPLE_COUNT_16_BIT;
else if (sample_count > 8)
samples = VK_SAMPLE_COUNT_8_BIT;
else if (sample_count > 4)
samples = VK_SAMPLE_COUNT_4_BIT;
else if (sample_count > 2)
samples = VK_SAMPLE_COUNT_2_BIT;
else if (sample_count == 1)
samples = VK_SAMPLE_COUNT_1_BIT;
else
/* error */;
在样品计数VkSampleCountFlagsBits
枚举是的一个位掩码可用于采样位在附件的数量的设置,所以在你的示例硬件支持任一个或16个样本(未17!)
因此,通常只支持$ 2 $的幂,对不对?
是的,尽管我仍将使用枚举位掩码而不是任何二次幂运算,只是为了使代码的目的更清楚。
我问的原因是我需要采用一个接口,该接口为我提供了一个
uint32_t
样本数量。我猜最好的解决方案是&
根据枚举位掩码对这个样本计数,并使用最大的非零值。@ 0xbadf00d是的,这正是我希望您采用的方法-基本上是一个在位掩码上进行的for循环,测试每个循环以枚举来自其中的值
VkSampleCountFlagBits
,然后可以应用逻辑为颜色和深度附件计算出最高的值。请注意我的编辑。这是我需要做的吗?