graphics - 在 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
and framebufferDepthSampleCounts
,它们的类型是VkSampleCountFlags
,而这又只是一个typedef
for uint32_t
。
关于多重采样的vulkan 教程页面确定这些字段中的最高位以计算最大可用采样计数。我其实不明白这个。例如,如果VK_SAMPLE_COUNT_16_BIT
和VK_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 */;
解决方案
枚举中的样本计数是附件中采样位数的可用VkSampleCountFlagsBits
设置的位掩码,因此在您的示例中,硬件支持一个或16 个样本(不是 17 个!)
推荐阅读
- linux - 文件未在 logrotate 脚本中删除,权限和用户、组详细信息未更新
- javascript - 如何在 HTML 中获取输入类型 Date 并在 angular7 component.ts 文件中使用?
- mysql - 如何更改我的 mysql TIMESTAMP 的时区
- r - 是否有用于列出列名的所有可能组合的 R 函数
- node.js - Firestore 更新数组。使用无效数据调用的联合函数
- newline - 如何在blockly中创建一个自定义块返回CRLF(回车+换行)作为字符串
- mysql - 如何使用日期时间从数据库中获取与当前日期相关的数据
- android - 以编程方式生成 recyclerview 项目时重复查看和数据
- javascript - 在我的 ul 列表中查找并分隔带有单词首字母的单词?
- c - C | 静态数组:为什么写越界不会导致异常?