我有一个计算着色器,它对深度采样器2D进行采样,但是当使用Texture()时,结果与一些锯齿状边缘一起变得奇怪。如果我使用texelFetch(),那么它工作得很好,所以我猜这是获取正确纹理坐标的问题?仅供参考,采样器使用最近的过滤,没有MIPS。
使用texelFetch:时,结果如下所示
texelFetch
这是使用texture:时的结果
texture
5us2dqdw1#
texelFetch需要纹理元素的整数坐标;您提供这些坐标,它们是精确的,没有舍入误差,因此您看不到任何伪像。
texture*系列函数需要浮点坐标,然后通过floor(uv*size)公式将它们转换回纹理坐标(假设它是带有GL_NEAREST过滤器的GL_TEXTURE_2D,这似乎就是您的情况)。当uv正好位于纹理元素之间时,此计算对浮点舍入误差很敏感,这里就发生了这种情况。
texture*
floor(uv*size)
GL_NEAREST
GL_TEXTURE_2D
uv
若要修复此问题,请将UV坐标偏移半个像素:
vec2 TexCoord = (vec2(iuv) + 0.5)/vec2(size);
1条答案
按热度按时间5us2dqdw1#
texelFetch
需要纹理元素的整数坐标;您提供这些坐标,它们是精确的,没有舍入误差,因此您看不到任何伪像。texture*
系列函数需要浮点坐标,然后通过floor(uv*size)
公式将它们转换回纹理坐标(假设它是带有GL_NEAREST
过滤器的GL_TEXTURE_2D
,这似乎就是您的情况)。当uv
正好位于纹理元素之间时,此计算对浮点舍入误差很敏感,这里就发生了这种情况。若要修复此问题,请将UV坐标偏移半个像素: