我正在使用纹理混合来实现地形片段着色器中的纹理从一种到另一种的过渡。在仅使用草纹理和混合泥土/草或雪/草纹理之间的接缝处,mipmap似乎会导致难看的接缝线(如下图所示)。禁用mipmap可以解决问题,但会使我的地形在远处非常粗糙/难看。有没有办法在不禁用mipmap的情况下消除这个接缝线呢?
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::initialize 纹理管理器::初始化
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
普通视图
放大后的视图
main
函数开始时对所有纹理进行采样,并在接下来的if
语句中使用已经采样的颜色... 另外,你可能会发现一些TEXTURE_MIP_FILTER
的用途。 - kerimgl.generateMipmap
来生成我的mipmaps。我已经添加了地形的顶点着色器。添加/删除CLAMP_TO_EDGE似乎没有任何区别,因为我的纹理坐标从未超过1.0或低于0.0。 - Andrew Rasmussen