【问题标题】:Interpolation on fragment shader starts at 0 + half pixel片段着色器上的插值从 0 + 半像素开始
【发布时间】: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


【解决方案1】:

如果没有多重采样技术,片段将始终在像素中心进行采样。您看到的行为是预期的行为。

您提到的纹理样本参数根本不影响插值。它们仅在使用texture() 系列 GLSL 函数从纹理中采样时才有效。

您的评论是正确的,将 texcoords 移动半个像素是不够的,您还需要一个比例。你想要的是一个 f(0.5/128)=0 和 f(127.5/128)=1 的映射。这当然是一个简单的线性变换 f(x)=(128/127)*x - 1/(2*127),您可以将其应用于顶点坐标,这样您至少不会有任何运行时开销如果您的视口大小是恒定的。

【讨论】:

    【解决方案2】:

    纹理坐标的应用方式,0对应第一个texel的左边缘,1对应最后一个texel的右边缘。大小为 128 时,第一个 texel 跨越从 0 到 1/128 的纹理坐标范围,中心位于 0.5/128。最后一个纹素的范围是 127/128 到 1,中心在 127.5/128。

    如果你想让第一个/最后一个纹素的中心在边缘,你需要相应地调整你的纹理坐标,在左边增加半个纹素的宽度,在右边减去相同的数量边缘:

    var textureCoordinates = [
        0.5 / 128.0, 127.5 / 128.0,
        127.5 / 128.0, 127.5 / 128.0,
        0.5 / 128.0, 0.5 / 128.0,
        127.5 / 128.0, 0.5 / 128.0
    ];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多