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

three.js使用AddEquation做径向渐变叠加出现异常暗边问题求解

问题根源

你遇到的渐变边缘暗带问题,核心是alpha预乘配置与混合公式不匹配,其次可能伴随深度写入/测试的配置错误。

具体原因分析

three.js的MeshBasicMaterial默认开启premultipliedAlpha: true,即纹理的RGB分量已经提前和alpha值相乘过。
你当前使用的混合参数对应计算公式为:

最终颜色 = 源颜色 * 源alpha + 目标颜色 * 1

由于源颜色已经预乘过一次alpha,公式中再次乘以源alpha就等于重复计算,当渐变边缘的alpha趋近于0时,该区域的颜色会被压得远低于预期,就会出现明显的深色暗带。

解决方案

有两种常用的修正方案,二选一即可:

方案1:调整混合参数匹配预乘alpha配置

保留默认的premultipliedAlpha: true,将源混合因子改为THREE.OneFactor,修正后混合公式刚好匹配预乘后的颜色计算逻辑,不会重复乘alpha:

const mat = new THREE.MeshBasicMaterial({
    alphaMap: grad2,
    blending: THREE.CustomBlending,
    blendEquation: THREE.AddEquation,
    blendSrc: THREE.OneFactor,
    blendDst: THREE.OneFactor,
    depthWrite: false // 额外关闭深度写入,避免同层级透明物体互相遮挡
});

方案2:关闭材质的预乘alpha选项

如果要保留你原来的SrcAlphaFactor源因子配置,显式关闭材质的预乘alpha即可:

const mat = new THREE.MeshBasicMaterial({
    alphaMap: grad2,
    blending: THREE.CustomBlending,
    blendEquation: THREE.AddEquation,
    blendSrc: THREE.SrcAlphaFactor,
    blendDst: THREE.OneFactor,
    premultipliedAlpha: false, // 关闭预乘alpha
    depthWrite: false
});

额外检查项

如果修正后仍有异常,可依次排查以下配置:

  • 确认WebGLRenderer初始化时开启了alpha: true,保证画布alpha通道正常参与混合
  • 确认渐变纹理的过滤模式设置为THREE.LinearFilter,避免最近邻过滤导致的边缘硬边
  • 确认透明物体的depthTest按需调整,同z轴层级的透明物体建议关闭深度测试避免闪烁

内容的提问来源于stack exchange,提问作者Marcin Zukowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:30:02