Android Filament地形网格仅显示绿色,无法实现基于Y轴高度的颜色渐变效果
Android Filament地形网格仅显示绿色,无法实现基于Y轴高度的颜色渐变效果
我看了你的代码,发现几个关键问题导致颜色渐变没生效,咱们一步步来修正:
问题1:顶点着色器中变量赋值错误
你在material定义里声明的heightFactor是float类型(单个浮点数),但你在顶点着色器里却给variable_heightFactor.y赋值——这完全不对,因为这个变量不是vec2,根本没有y分量。这会导致高度因子没有被正确传递到片元着色器,最终t值一直是0,所以只会显示baseColor(绿色)。
问题2:顶点位置获取方式不正确
在Filament的顶点着色器中,getPosition()不是标准的API,无法正确获取顶点的原始位置。你应该直接使用MaterialVertexInputs里的attributes.position来获取顶点Y轴高度。
问题3:片元着色器中变量引用错误
因为heightFactor是float类型,你在片元着色器里不需要取.y分量,直接使用变量本身即可。
修正后的完整Shader代码
Material定义(基本不变,确认变量类型)
material { name : terrain, shadingModel : unlit, vertexDomain : object, parameters : [ { type : float4, name : baseColor }, { type : float4, name : peakColor }, { type : float2, name : heightRange } ], variables : [ { name : heightFactor, type : float, interpolation : smooth } ], requires : [ uv0 ] }
Vertex着色器(修正位置获取和变量赋值)
vertex { void materialVertex(inout MaterialVertexInputs tp) { // 正确获取顶点Y轴高度 float h = tp.attributes.position.y; float minH = materialParams.heightRange.x; float maxH = materialParams.heightRange.y; // 归一化高度因子,直接赋值给float类型变量 variable_heightFactor = clamp((h - minH) / (maxH - minH), 0.0, 1.0); } }
Fragment着色器(修正变量引用)
fragment { void material(inout MaterialInputs material) { prepareMaterial(material); float t = variable_heightFactor; material.baseColor = mix(materialParams.baseColor, materialParams.peakColor, t); } }
Kotlin代码补充检查点
除了Shader,还要确保你在初始化MaterialInstance时正确设置了参数:
// 假设你已经创建了terrainMaterial和terrainMI terrainMI?.apply { // 设置基础色(绿色)和峰值色(蓝色) setParameter("baseColor", floatArrayOf(0.0f, 1.0f, 0.0f, 1.0f)) setParameter("peakColor", floatArrayOf(0.0f, 0.0f, 1.0f, 1.0f)) // 对应你生成的地形Y轴范围:0到15(因为你用了Math.random()*15) setParameter("heightRange", floatArrayOf(0.0f, 15.0f)) }
额外提醒
- 确认你的相机位置能完整看到地形的高低差,避免因为视角问题误以为渐变没生效。
- 可以暂时把地形的Y轴高度固定成几个极端值(比如底部0,顶部15)来测试渐变是否正常工作,排除随机高度的干扰。
改完这些之后,你的地形应该就能正常显示从绿色到蓝色的高度渐变了!




