我正在编写一个片段着色器,它必须在给定像素周围的区域中对给定纹理进行采样。我使用texelFetch
而不是,texture
因为我想要相邻像素的精确值而不进行任何过滤。最初我编写的代码如下:
in vec2 pixel;
uniform sampler2D tex;
void main() {
float leftPixel = texelFetch(tex, ivec2(pixel.x - 1, pixel.y), 0).r;
...
}
然而,在阅读了有关依赖纹理读取的内容后,我将代码更改为更像这样:
in vec2 pixel;
in vec2 leftPixelLoc;
uniform sampler2D tex;
void main() {
float leftPixel = texelFetch(tex, ivec2(leftPixelLoc), 0).r;
...
}
在上面的代码中,顶点着色器leftPixelLoc
为我计算。我希望这可以防止依赖纹理读取。但是,我现在意识到,ivec2
无论如何,简单地调用都可能导致依赖纹理读取。是这样吗?如果是这样,如何在访问目标像素周围像素的精确值时避免依赖纹理读取?
15 年来,“依赖纹理读取”在图形编程中一直不是一个有意义的概念。它的存在是为了描述对纹理访问有极端限制的硬件,但这种硬件基本上已经不存在了。而且这些硬件都无法处理
texelFetch
;它们甚至无法处理着色器数学中的实数整数。因此,目前尚不清楚假设存在此问题的硬件将如何与此类着色器配合使用。