You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL着色器中使用sandMap纹理遮罩控制sand纹理显示异常问题求助

问题分析与修复方案

我帮你排查出两个关键问题,这俩问题共同导致了你的预期效果没实现:

1. 片段着色器函数缺少默认返回值

你的getTexture()函数只有在sandMap绿色通道值≥0.2时才有返回值,当条件不满足时没有任何返回语句。在GLSL中,这种未定义行为会让GPU做出不可预测的操作——比如直接复用之前的纹理采样结果,或者默认返回sand纹理的颜色,这就导致整个地形都被sand覆盖。

修复方法:给函数添加一个默认返回值,比如符合你预期的黑色(或者后续要加的grass纹理):

vec4 getTexture() {
 if (texture(sandMap, IN.texCoord ).g >= 0.2) {
 return texture(sandTex, IN.texCoord);
 }
 // 返回黑色作为默认区域的颜色
 return vec4(0.0, 0.0, 0.0, 1.0);
 // 如果后续要启用grass纹理,就改成return texture(grassTex, IN.texCoord);
}

2. sandMap纹理路径存在多余空格

看你的纹理加载代码:

sandMap = SOIL_load_OGL_texture(TEXTUREDIR"sandmap.PNG ", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS);

注意"sandmap.PNG "后面多了一个空格!这会导致SOIL找不到正确的文件,加载失败后sandMap会是无效的纹理ID(通常是0)。当你采样无效纹理时,GL会默认返回白色(RGB值都是1),所以sandMap的绿色通道值永远是1,满足≥0.2的条件,自然整个地形都显示sand纹理。

修复方法:去掉路径里的多余空格:

sandMap = SOIL_load_OGL_texture(TEXTUREDIR"sandmap.PNG", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS);

额外验证步骤

为了确保问题彻底解决,你可以在片段着色器里临时输出sandMap的绿色通道值,看看采样是否正常:

void main(void) {
 // 临时测试:输出sandMap的绿色通道灰度图
 fragColour = vec4(0.0, texture(sandMap, IN.texCoord).g, 0.0, 1.0);
 // 测试没问题后再换回原逻辑
 // fragColour = getTexture();
}

如果此时地形上能看到sandMap的绿色通道灰度分布,说明纹理加载和采样都正常了,再换回原来的纹理混合逻辑即可。

内容的提问来源于stack exchange,提问作者Danny G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 23:52:32