首页 > 解决方案 > 在 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结构包含字段framebufferColorSampleCountsand framebufferDepthSampleCounts,它们的类型是VkSampleCountFlags,而这又只是一个typedeffor uint32_t

关于多重采样的vulkan 教程页面确定这些字段中的最高位以计算最大可用采样计数。我其实不明白这个。例如,如果VK_SAMPLE_COUNT_16_BITVK_SAMPLE_COUNT_1_BIT都设置在这些字段中怎么办?这是否意味着最大可用采样数至少为 17?

在一天结束时我需要做的是,给定 a 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 */;

标签: graphicsvulkan

解决方案


枚举中的样本计数是附件中采样位数的可用VkSampleCountFlagsBits设置的位掩码,因此在您的示例中硬件支持一个16 个样本(不是 17 个!)


推荐阅读