假设我正在制作一个VkSampler,或者可能是一组VkSamplers,我打算将其与多个纹理一起使用。每个纹理具有多个mip级别,并且mip级别的数量因纹理而异。我希望所有采样器的所有纹理选项都相同,但maxLod
可能例外。
我实际上不希望maxLod
阻止任何特定的mip级别被使用。我只希望以普通的,非错误的方式使用每个纹理的所有级别。因此,我可以仅抛出一个高得离谱的上限,并对所有纹理使用相同的采样器:
VkSamplerCreateInfo samplerCreateInfo;
...
samplerCreateInfo.minLod = 0;
samplerCreateInfo.maxLod = 1048576;
...还是我需要为每个纹理创建一个不同的采样器,并将采样器的
maxLod
设置为该纹理的唯一最大mip索引?我认为答案可能是,即使采样器的
maxLod
非常高,我也可以依靠合理的钳位发生-即使我随后在着色器中将无用的高值明确传递给textureLod
,但我并不完全确保我已经正确解释了Vulkan和GLSL规范中的相关部分。 最佳答案
不,您可以将maxLod
设置为所需的大小。如果在某些情况下“过高”,它们将被列为有效使用要求。根据规范,唯一的要求是它大于或等于minLod
,如果unnormalizedCoordinates
为true,则它必须为零。除此之外,它仅用于钳位计算的lod。访问的实际mipmap级别是计算的lod(固定为maxLod),进一步固定为纹理中实际可用的mipmap级别数。
在规范语言中,maxLod
用于限制λ(Level of Detail Operation)的值。然后访问的mipmap级别为d'= levelbase +钳位(λ,0,levelCount - 1
)(Image Level(s) Selection)。因此,如果maxLod
大于levelCount - 1
,则不会影响结果。