Vulkan 采样器的 maxLod 会不会太高?
Can a Vulkan sampler's maxLod be too high?
假设我正在制作一个 VkSampler,或者可能是一组 VkSampler,我打算将其与多个纹理一起使用。每个纹理都有多个 mip 级别,并且 mip 级别的数量因纹理而异。我希望所有纹理的所有采样器选项都相同,但 maxLod
.
可能除外
我实际上并不希望 maxLod
阻止使用任何特定的 mip 级别;我只希望每个纹理的所有级别都以一种普通的、无错误的方式使用。那么我可以只输入一个荒谬的高上限并对所有纹理使用相同的采样器吗:
VkSamplerCreateInfo samplerCreateInfo;
...
samplerCreateInfo.minLod = 0;
samplerCreateInfo.maxLod = 1048576;
...或者我是否需要为每个纹理创建不同的采样器并将采样器的 maxLod
设置为该纹理的唯一最大 mip 索引?
我认为答案可能是即使我的采样器的 maxLod
非常高,我也可以指望发生合理的钳位 - 即使我随后明确地将一个无用的高值传递给 textureLod
着色器 - 但我不确定我是否正确解释了 Vulkan 和 GLSL 规范中的相关部分。
不,您可以将 maxLod
设置为任意大小。如果存在 "too high" 的情况,它们将被列为有效使用要求。根据规范,唯一的要求是它大于或等于 minLod
,如果 unnormalizedCoordinates
为真,则它必须为零。除此之外,它仅用于限制计算的 lod。访问的实际 mipmap 级别是计算的 lod(固定为 maxLod),进一步固定为纹理中实际可用的 mipmap 级别数。
在规范语言中,maxLod
用于限制λ的值(Level of Detail Operation). Then the mipmap level accessed, is d' = levelbase + clamp(λ, 0, levelCount - 1
) (Image Level(s) Selection)。所以如果maxLod
大于levelCount - 1
,不会影响结果。
假设我正在制作一个 VkSampler,或者可能是一组 VkSampler,我打算将其与多个纹理一起使用。每个纹理都有多个 mip 级别,并且 mip 级别的数量因纹理而异。我希望所有纹理的所有采样器选项都相同,但 maxLod
.
我实际上并不希望 maxLod
阻止使用任何特定的 mip 级别;我只希望每个纹理的所有级别都以一种普通的、无错误的方式使用。那么我可以只输入一个荒谬的高上限并对所有纹理使用相同的采样器吗:
VkSamplerCreateInfo samplerCreateInfo;
...
samplerCreateInfo.minLod = 0;
samplerCreateInfo.maxLod = 1048576;
...或者我是否需要为每个纹理创建不同的采样器并将采样器的 maxLod
设置为该纹理的唯一最大 mip 索引?
我认为答案可能是即使我的采样器的 maxLod
非常高,我也可以指望发生合理的钳位 - 即使我随后明确地将一个无用的高值传递给 textureLod
着色器 - 但我不确定我是否正确解释了 Vulkan 和 GLSL 规范中的相关部分。
不,您可以将 maxLod
设置为任意大小。如果存在 "too high" 的情况,它们将被列为有效使用要求。根据规范,唯一的要求是它大于或等于 minLod
,如果 unnormalizedCoordinates
为真,则它必须为零。除此之外,它仅用于限制计算的 lod。访问的实际 mipmap 级别是计算的 lod(固定为 maxLod),进一步固定为纹理中实际可用的 mipmap 级别数。
在规范语言中,maxLod
用于限制λ的值(Level of Detail Operation). Then the mipmap level accessed, is d' = levelbase + clamp(λ, 0, levelCount - 1
) (Image Level(s) Selection)。所以如果maxLod
大于levelCount - 1
,不会影响结果。