与其他Vulkan的结构不同,所有type pArrayName*;
都有一个带有数组长度的伴随uint32_t arrayNameCount
,结构VkPipelineMultisampleStateCreateInfo
没有为字段sampleMaskCount
定义任何const VkSampleMask* pSampleMask;
。
Vulkan docs说明了以下有效用法:
“如果pSampleMask不是NULL,则pSampleMask必须是指向⌈rasterizationSamples/32⌉VkSampleMask值数组的指针。”
但VkSampleCountFlagBits rasterizationSamples;
是一个按位值:
rasterizationSamples是一个VkSampleCountFlagBits,用于指定光栅化中每个像素的采样数。
到目前为止一切顺利。
但是VkSampleCountFlagBits是2个幂的枚举,范围从0x01到0x40(或01到64十进制)。可能的ANDed值的范围可以是01到127。
所以我想从1到31的按位值将导致长度为0的pSampleMask
;从32到63的值将给出长度2,依此类推。
这是对的吗? 我真的很傻了!
答案 0 :(得分:5)
当他们说" rasterizationSamples"在公式中,它们几乎肯定意味着"光栅化样本的数量",而不是" rasterizationSamples位掩码的值"。
此外,⌈...⌉表示向上舍入到最接近的整数。
因此,对于从1到32的栅格化样本计数(位掩码值0x01到0x20),pSampleMask指向单个值。对于栅格化样本计数从33到64(位掩码值0x40),它指向两个值的数组。
我注意到位掩码的值与每个位的描述对齐(64的值为64,依此类推)但它可能是巧合。
答案 1 :(得分:1)
rasterizationSamples
必须只是其中一个SampleCountFlagBits
值(不一个bitwised |值)。
简单来说,您需要pSampleMask
数组(由32 b值组成)中的位数大于或等于rasterizationSamples
指定的样本数量。 (即除VkSampleMask := uint32_t
之外的所有人SAMPLE_COUNT_64
,其中需要两个{/ p>
他们没有为此目的选择单个uint64_t,这有点可笑。 (也许他们计划增加128个样本:)