Glsl 小车纹理坐标映射

Glsl 小车纹理坐标映射,glsl,glsles,Glsl,Glsles,我找不到偏移到坐标的问题,反之亦然,但是一旦尺寸变大,就会有一个问题反复出现。这在Chrome上运行 我正在尝试55x56纹理,我使用以下例程从逻辑积分偏移映射到TexCoords的uv(st)并返回。有些地方累积了一些错误,导致两个后续偏移量(例如54和55)映射到同一个texel 下面添加halfTexel的线条出现在StackOverflow的一个帖子中(这很有意义)。在着色器的开头,我还有一行: // const vec2 halfTexel = vec2(${1.0 / (2.0 *

我找不到偏移到坐标的问题,反之亦然,但是一旦尺寸变大,就会有一个问题反复出现。这在Chrome上运行

我正在尝试55x56纹理,我使用以下例程从逻辑积分偏移映射到TexCoords的uv(st)并返回。有些地方累积了一些错误,导致两个后续偏移量(例如54和55)映射到同一个texel

下面添加halfTexel的线条出现在StackOverflow的一个帖子中(这很有意义)。在着色器的开头,我还有一行:

// const vec2 halfTexel = vec2(${1.0 / (2.0 * xScale)}, ${1.0 / (2.0 * yScale)});
// xscale is the width (55)
// yscale is the height (56)

precision highp float;
...
vec2 offsetToCoords_A(int offset) {
  const vec2 halfTexel = vec2(0.00909090909090909, 0.008928571428571428);
  const float xScale = 55.0;
  const float yScale = 56.0;
  float offsetF = float(offset);
  float s = mod(offsetF, 55.0);
  float t = floor(offsetF / 55.0);
  vec2 coords = vec2(s/xScale, t/yScale) + halfTexel;
  return coords;
}

int coordsToOffset_A(vec2 coords) {
  const float xScale = 55.0;
  const float yScale = 56.0;
  float s = coords.s * xScale;
  float t = coords.t * yScale;
  int offset = int(t) * 55 + int(s);
  return offset;
}
样本结果:

49,50,51,52,53,54,54,56,57,58,59,
...
106,107,108,109,109,111,112,113

删除mod并将
OffsetOords
更改为以下内容:

vec2 offsetToCoords_A(int offset) {
  const vec2 halfTexel = vec2(0.00909090909090909, 0.008928571428571428);
  const float xScale = 55.0;
  const float yScale = 56.0;
  int t = offset / int(xScale);
  int s = offset - t*int(xScale);
  vec2 coords = vec2(s,t)/vec2(xScale, yScale) + halfTexel;
  return coords;
}

样本结果是如何获得的?它看起来像是
coordsToOffset\u A
的输出,但它的输入是什么?函数
offsetToCoords\u A
是否以任何方式使用?如果我取一个偏移量(比如55)并将其传递给
offsetToCoords\u A
,我会得到可以用来传递给纹理2d(A,coords)
的坐标。我还展示了另一个函数,我用它来将变量(TexCoords)映射到偏移量。我认为这个函数
coordsToOffset``是可以的。当然,在这两个调用之间有一些处理。不过,我已将问题缩小到这两个方面。我刚刚打印了调用
OffsetOords\u A
.s
结果。O在第55次调用时,结果vec2的x坐标为1.00909004211426。这表明
mod
功能有问题