确定 Vulkan 中可能的最高颜色和深度附件样本数
Determing the highest possible color and depth attachement sampled count in Vulkan
我是否需要将 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 */;
VkSampleCountFlagsBits
枚举中的样本计数是附件中采样位数的 可用 设置的位掩码,因此在您的示例中硬件支持 一个 或 16 个样本(不是 17!)
我是否需要将 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 */;
VkSampleCountFlagsBits
枚举中的样本计数是附件中采样位数的 可用 设置的位掩码,因此在您的示例中硬件支持 一个 或 16 个样本(不是 17!)