【发布时间】:2020-12-04 15:26:51
【问题描述】:
我是否需要将 VkAttachmentDescription::samples 的值设置为 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 结构包含framebufferColorSampleCounts 和framebufferDepthSampleCounts 字段,它们的类型为VkSampleCountFlags,而这又只是typedef 的uint32_t。
vulkan-tutorial page on multisampling 确定这些字段中的最高位以计算最大可用采样计数。我其实不明白这个。例如,如果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,并且从物理设备属性中给出了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 */;
【问题讨论】:
-
这就是我希望你必须实现的。我想您将在代码库中进行大量整数掩码与枚举之间的映射,因此您可能需要考虑制作一些辅助方法。我有一个基于 Java 的 Vulkan 实现,可以做到这一点。