我在地形的片段着色器中使用纹理混合,以从一种纹理混合到另一种纹理。在仅使用我的草纹理与在土/草或雪/草纹理之间混合之间的接缝处,mipmap似乎造成了难看的接缝(请参见下面的照片)。禁用mipmapping可以解决此问题,但使我的地形在远处非常粗糙/难看。有没有一种方法可以在不禁用mipmapping的情况下消除这种缝隙?

terrain-vs.glsl:

precision mediump float;

attribute vec3 Position;
attribute vec2 TextureCoord;

uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;

varying vec2 texCoord;
varying float y;

void main(void) {
  gl_Position = uPMatrix * uMVMatrix * vec4(Position, 1.0);
  texCoord = TextureCoord;
  y = Position.y;
}

terrain-fs.glsl:
precision mediump float;

uniform sampler2D dirt_texture;
uniform sampler2D grass_texture;
uniform sampler2D snow_texture;

varying vec2 texCoord;
varying float y;

void main(void) {
  if (y < -5.0) {
    gl_FragColor = texture2D(dirt_texture, texCoord);
  } else if (y < 0.0) {
    gl_FragColor = mix(
      texture2D(dirt_texture, texCoord),
      texture2D(grass_texture, texCoord),
      (y + 5.0) / 5.0
    );
  } else if (y < 3.0) {
    gl_FragColor = texture2D(grass_texture, texCoord);
  } else if (y < 5.0) {
    gl_FragColor = mix(
      texture2D(grass_texture, texCoord),
      texture2D(snow_texture, texCoord),
      (y - 3.0) / 2.0
    );
  } else {
    gl_FragColor = texture2D(snow_texture, texCoord);
  }
}

TextureManager::初始化
gl.bindTexture(gl.TEXTURE_2D, texture.texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.image);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.generateMipmap(gl.TEXTURE_2D);
gl.bindTexture(gl.TEXTURE_2D, null);

配置:
  • Windows 7专业版SP1
  • Google Chrome 24.0.1312.57 m
  • NVIDIA GTX 680


  • 普通 View

    放大

    最佳答案

    解释为什么原始片段着色器会产生伪像
    GPU需要知道渐变以对纹理进行采样。您可以显式提供渐变(textureGrad),也可以让GPU为您计算渐变。自动计算的梯度是使用局部差分计算的。有关详细信息,请参见函数dFdx(http://www.opengl.org/sdk/docs/manglsl/xhtml/dFdx.xml)。
    当函数评估一个像素但不评估附近的像素(非均匀控制流)时,计算导数会产生不确定的结果。
    答案1中的着色器效果很好,因为无论是否使用纹理结果,总是对纹理进行采样。
    更多信息在这里http://www.opengl.org/wiki/Sampler_(GLSL)#Non-uniform_flow_control

    关于opengl-es - 如何消除贴图的接缝,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14765517/

    10-10 08:24