Vulkan 采样器的 maxLod 会不会太高?

mjw*_*ach 4 glsl texture-mapping vulkan

假设我正在制作一个 VkSampler,或者可能是一组 VkSampler,我打算将它与多个纹理一起使用。每个纹理都有多个 mip 级别,并且 mip 级别的数量因纹理而异。我希望所有纹理的所有采样器选项都相同,但maxLod.

我实际上不想maxLod阻止使用任何特定的 mip 级别;我只希望以一种普通的、正确的方式使用每个纹理的所有级别。那么我是否可以只抛出一个高得离谱的上限并对所有纹理使用相同的采样器:

VkSamplerCreateInfo samplerCreateInfo;
Run Code Online (Sandbox Code Playgroud)

...

samplerCreateInfo.minLod = 0;
samplerCreateInfo.maxLod = 1048576;
Run Code Online (Sandbox Code Playgroud)

...或者我是否需要为每个纹理创建不同的采样器maxLod并将采样器设置为该纹理的唯一最大 mip 索引?

我认为答案可能是,即使我的采样器maxLod非常高,我也可以指望发生合理的钳位——即使我textureLod在着色器中明确地传递了一个无用的高值——但我不完全确定我是否正确解释了Vulkan 和 GLSL 规范中的相关部分。

Jes*_*all 5

不,您可以maxLod随心所欲地制作大小。如果存在“太高”的情况,它们将被列为有效使用要求。根据规范,唯一的要求是它大于或等于minLod,如果unnormalizedCoordinates为真则它必须为零。除此之外,它仅用于限制计算的 lod。访问的实际 mipmap 级别是计算出的 lod(限制为 maxLod),进一步限制为纹理中实际可用的 mipmap 级别数。

在规范语言中,maxLod用于限制 ? (详细操作级别)。然后访问的 mipmap 级别是d' = level base +clamp(?, 0, levelCount - 1) ( Image Level(s) Selection )。因此,如果maxLod大于levelCount - 1,则不会影响结果。