如何修复OpenGL三角形地形纹理镜像、草地纹理局部模糊问题
问题排查与修复方案
纹理镜像问题原因与修复
该问题完全由绘制代码的UV坐标生成逻辑、纹理数据朝向问题导致:
- 你当前的UV生成逻辑每2列就强制重置s坐标为0,配合反向遍历的索引生成逻辑,会导致部分三角形的UV顺序颠倒,出现镜像:
原UV生成逻辑是为2单位宽度的面分配0-1的s坐标,但是你生成索引时第二个循环是col从terrain_width-1倒序遍历到0,部分三角形的顶点顺序被翻转,对应UV也被翻转。
修复方式:直接按顶点坐标生成UV即可,不需要分奇偶行、分间隔重置,比如要每1x1的地形网格显示一次完整草地纹理,直接修改UV生成代码为:for (col = 0; col < terrain_width; col++) { // 直接用坐标值作为UV,可根据需要调整缩放参数控制纹理密度 terrain_texture_coordinates.emplace_back(col * 0.5f, row * 0.5f); } - lodepng默认解码出的PNG图像原点在左上角,OpenGL纹理采样默认原点在左下角,会导致纹理整体上下镜像,可以在解码后翻转图像数据,或者生成UV时把t坐标改为
1.0f - row * 缩放系数。
纹理模糊问题原因与修复
该问题同时涉及纹理参数配置和UV逻辑问题:
- 你没有生成纹理mipmap,当相机距离地形较远时,单张高分辨率纹理采样会出现明显模糊,需要在纹理加载代码中补充mipmap生成和对应过滤参数配置,同时显式设置纹理包裹模式避免驱动默认值差异,修正后的纹理加载关键代码如下:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image.data()); // 新增:生成mipmap glGenerateMipmap(GL_TEXTURE_2D); // 原有过滤参数修改,缩小过滤用三线性过滤 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 新增:显式设置纹理重复模式,适合草地这类重复纹理 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - 原有UV逻辑下部分区域UV拉伸范围超过1,线性采样时会强制插值,也会导致模糊,替换UV生成逻辑后可解决。
额外代码问题修复
你代码末尾禁用顶点属性时,错误禁用了a("color"),实际需要禁用的是之前启用的a("texCoord"),否则会导致后续绘制出现状态错误:
// 错误写法 // glDisableVertexAttribArray(spTextured->a("color")); // 正确写法 glDisableVertexAttribArray(spTextured->a("texCoord"));
内容的提问来源于stack exchange,提问作者code_rushh
相关产品推荐
相关产品推荐

