【发布时间】:2014-12-29 02:22:33
【问题描述】:
我在片段着色器上遇到插值问题。我只是在画一个全屏四边形。视口设置为 (0, 0, 128, 128)。
每个顶点都有一个纹理坐标。
var textureCoordinates = [
0.0, 1.0,
1.0, 1.0,
0.0, 0.0,
1.0, 0.0
];
我通过可变变量将纹理坐标从顶点着色器传递给片段着色器,效果很好。
vTextureCoord = aTextureCoord;
问题是插值从 0+halfpixel 开始,到 1-halfpixel 结束。半像素为 (1/128) * 0.5。
我希望插值从 0 开始并在 1 结束。这是因为 vTextureCoord 将用作片段着色器上的噪声函数的输入。
MAG 和 MIN 过滤器都设置为 NEAREST。
WRAP_S 和 WRAP_T 设置为 CLAMP_TO_EDGE。
请注意,纹理坐标属性不是强制性的,这只是我将数字从 0 插入到 1 的方式。如果有更简单的方法可以在片段着色器上使用其他东西而不是属性然后我很想知道如何!
我尝试将纹理坐标偏移半个像素,但它似乎没有像我预期的那样工作。
我也尝试在片段着色器上减去半个像素,但插值不会在 1 处结束。
newTextureCoord = vTextureCoord - (1.0 / 128.0) * 0.5;
非常感谢任何提示、cmets 或反馈!
【问题讨论】:
-
你是否也在传递顶点坐标?您应该将顶点坐标作为 3 分量数组(在顶点着色器中声明为 vec4)和纹理坐标作为 2 分量数组(在顶点着色器中声明为 vec2)传递给顶点着色器。对于 Wrap_S 和 Wrap_T,我将 GL_CLAMP 用于这种纹理。
-
是的,我也在传递顶点坐标,一切都被正确绘制。只是插值的行为不像我需要的那样。 var noiseVertices = [ -1.0, 1.0, 0.0, 1.0, 1.0, 0.0, -1.0, -1.0, 0.0, 1.0, -1.0, 0.0 ];
-
那么也许 WRAP_S 和 WRAP_T 的 GL_CLAMP 就是答案。
-
糟糕,我知道你正在这样做。
-
其实我看不太清楚。我查看了一些旧代码,我使用的是 GL_CLAMP,而不是 GL_CLAMP_TO_EDGE(就像你一样)。这两个枚举之间存在细微差别,这与您遇到的问题类型有关。
标签: opengl glsl webgl interpolation fragment-shader