Zebrafish Asked: 2025-03-07 08:21:21 +0800 CST2025-03-07 08:21:21 +0800 CST 2025-03-07 08:21:21 +0800 CST 使用 usampler2D 时是否应该进行插值? 772 我正在使用 usampler2D 在着色器中对 R16_UINT 图像进行采样。我这样做: uvec4 upix_color = texture(usampler2D(utextures[nonuniformEXT(idx_of_height_map)], samplers[0]), result.uvs); 但看起来这些值并没有经过过滤/插值,如下图所示: 我知道 R16 灰度图像也可以是 R16_UNORM,在这种情况下它被读取为规范化浮点数,并且我知道整数可能更难插值,但 0 到 65,535 范围内的整数应该能够被插值。 glsl 1 个回答 Voted Best Answer Yun 2025-03-07T14:09:33+08:002025-03-07T14:09:33+08:00 OpenGL 在 OpenGL 中,整数纹理不支持插值(线性过滤)。事实上,尝试配置此功能会导致纹理不完整。摘自OpenGL 4.5 规范第 8.17 节: 使用前面的定义,除非以下任何条件成立,否则纹理是完整的: ... 纹理的内部格式是整数(见表 8.12)[...] 并且放大过滤器不是NEAREST,或者缩小过滤器既不是NEAREST也不是NEAREST_MIPMAP_NEAREST。 ... (为清晰起见,文本已重新排序。) 换句话说,对于整数纹理,过滤参数必须设置为最近邻过滤。 Khronos 网站上也用不太专业的术语表达了这一点: 整数颜色格式 [...] 不支持线性过滤。因此,GL_TEXTURE_MAG_FILTER采样参数必须是GL_NEAREST,并且GL_TEXTURE_MIN_FILTER必须是GL_NEAREST或GL_NEAREST_MIPMAP_NEAREST。 火力 在 Vulkan 中,实现可能支持整数纹理的插值(线性过滤),但这不是必需的。从Vulkan 1.4.310 规范第 48.3 节来看: 实现必须至少支持所列格式的以下功能集。对于图像,每个格式都必须支持这些功能VkImageType[...]。... 下 表显示了每个格式必须支持哪些功能位。 在下表中,它显示VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT整数图像格式(包括)不支持(即支持线性过滤)VK_FORMAT_R16_UINT。理论上,您可以使用GetPhysicalDeviceFormatProperties查询实现上是否可以使用插值。但是,我预计这种情况(几乎)永远不会发生,因为纹理的浮点插值通常在硬件中实现,但整数插值则不是。
OpenGL
在 OpenGL 中,整数纹理不支持插值(线性过滤)。事实上,尝试配置此功能会导致纹理不完整。摘自OpenGL 4.5 规范第 8.17 节:
(为清晰起见,文本已重新排序。)
换句话说,对于整数纹理,过滤参数必须设置为最近邻过滤。
Khronos 网站上也用不太专业的术语表达了这一点:
火力
在 Vulkan 中,实现可能支持整数纹理的插值(线性过滤),但这不是必需的。从Vulkan 1.4.310 规范第 48.3 节来看:
在下表中,它显示
VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
整数图像格式(包括)不支持(即支持线性过滤)VK_FORMAT_R16_UINT
。理论上,您可以使用GetPhysicalDeviceFormatProperties
查询实现上是否可以使用插值。但是,我预计这种情况(几乎)永远不会发生,因为纹理的浮点插值通常在硬件中实现,但整数插值则不是。