You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android Filament地形网格仅显示绿色,无法实现基于Y轴高度的颜色渐变效果

Android Filament地形网格仅显示绿色,无法实现基于Y轴高度的颜色渐变效果

我看了你的代码,发现几个关键问题导致颜色渐变没生效,咱们一步步来修正:


问题1:顶点着色器中变量赋值错误

你在material定义里声明的heightFactorfloat类型(单个浮点数),但你在顶点着色器里却给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)来测试渐变是否正常工作,排除随机高度的干扰。

改完这些之后,你的地形应该就能正常显示从绿色到蓝色的高度渐变了!

火山引擎 最新活动