OpenGL计算着色器从调用ID生成错误的纹理坐标

46scxncf  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(197)

我有一个计算着色器,它对深度采样器2D进行采样,但是当使用Texture()时,结果与一些锯齿状边缘一起变得奇怪。如果我使用texelFetch(),那么它工作得很好,所以我猜这是获取正确纹理坐标的问题?仅供参考,采样器使用最近的过滤,没有MIPS。

使用texelFetch:时,结果如下所示

这是使用texture:时的结果

5us2dqdw

5us2dqdw1#

texelFetch需要纹理元素的整数坐标;您提供这些坐标,它们是精确的,没有舍入误差,因此您看不到任何伪像。

texture*系列函数需要浮点坐标,然后通过floor(uv*size)公式将它们转换回纹理坐标(假设它是带有GL_NEAREST过滤器的GL_TEXTURE_2D,这似乎就是您的情况)。当uv正好位于纹理元素之间时,此计算对浮点舍入误差很敏感,这里就发生了这种情况。

若要修复此问题,请将UV坐标偏移半个像素:

vec2 TexCoord = (vec2(iuv) + 0.5)/vec2(size);

相关问题