【发布时间】:2017-11-23 02:48:36
【问题描述】:
我编写了以下着色器,用于测试线性过滤在 OpenGL 中的工作原理。
这里我们将一个 5x1 的纹理喷到立方体的一个面上(megenta 区域只是背景的颜色)。
纹理就是这个(很小)。
左下角对应uv=(0, 0),右上角对应uv=(1, 1)。
启用线性过滤。
着色器将v 坐标垂直拆分为 5 行(从上到下):
- 连续采样。只需正常采样即可。
- 如果 u 在 [0, 1] 中则为绿色,否则为红色。仅用于测试目的。
- 灰度 u 坐标。
- 在纹素左侧采样。
- 在纹素中心采样。
问题是在3 和4 之间有一行闪烁的一个像素。闪烁通过改变相机距离来改变,有时你甚至可以让它消失。问题似乎出在处理第四行的着色器代码中。
// sample at the left of the pixel
// the following line can fix the problem if I add any number different from 0
tc.y += 0.000000; // replace by any number other than 0 and works fine
tc.x = floor(5 * tc.x) * 0.2;
c = texture(tex0, tc);
这对我来说看起来很奇怪,因为在该区域中,v 坐标不在纹理的任何边缘附近。
【问题讨论】:
-
那么,纹理对象是如何设置的?
-
不确定设置纹理对象是什么意思。你是指
glTexParameter设置的东西吗?如果是这样,您可以在图像的左下角看到它们:线性过滤和钳制到边缘。