假设我正在制作一个VkSampler,或者可能是一组VkSamplers,我计划将其与几个纹理一起使用。每个纹理都有多个mip级别,mip级别的数量因纹理而异。我希望所有采样器选项对于所有纹理都是相同的,除了maxLod
。
实际上,我不希望maxLod
阻止使用任何特定的mip级别;我只希望每个纹理的所有级别都能以一种普通的、没有错误的方式使用。因此,我可以输入一个高得离谱的上限,并对所有纹理使用相同的采样器吗:
VkSamplerCreateInfo samplerCreateInfo;
samplerCreateInfo.minLod = 0;
samplerCreateInfo.maxLod = 1048576;
还是我需要为每个纹理创建一个不同的采样器,并将采样器的maxLod
设置为该纹理的唯一最大mip索引?
我认为答案可能是,即使我的采样器的maxLod
非常高,即使我在着色器中显式地将一个无用的高值传递给textureLod
,我也可以指望会发生合理的箝位,但我不完全确定我是否正确解释了Vulkan和GLSL规范中的相关部分。
不,您可以使maxLod
任意大。如果有"过高"的情况,它们将被列为有效使用要求。根据规范,唯一的要求是它大于或等于minLod
,如果unnormalizedCoordinates
为真,那么它必须为零。除此之外,它只用于钳制计算的lod。访问的实际mipmap级别是计算的lod(钳制到maxLod(,进一步钳制到纹理中实际可用的mipmap等级的数量。
在规范语言中,maxLod
用于限制λ(详细程度操作(的值。然后访问的mipmap级别为d'=levelbase+clamp(λ,0,levelCount - 1
((图像级别选择(。因此,如果maxLod
大于levelCount - 1
,则不会影响结果。