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

Godot 4中实现受光照时透明的2D对象的技术问询

实现Godot 4中受光照时透明的2D对象(与light_only相反效果)

要实现“受光照区域透明、无光照区域显示原纹理”的效果,核心是获取当前像素的光照强度,并用其反向控制alpha通道。针对你遇到的Godot 4 API变化问题,以下是可行的解决方案:

核心思路

Godot 4的渲染管线重构后,AT_LIGHT_PASS已不再适用,替代方案是通过light_calculator()获取当前像素的累计光照量,再用这个值反向调整透明度——光照越强,alpha值越低(越透明)。

完整着色器代码

shader_type canvas_item;

void fragment() {
    // 获取原纹理的颜色与透明度
    vec4 base_color = texture(TEXTURE, UV);
    
    // 获取当前像素的累计光照强度(取RGB通道均值或单通道,默认白光照下三者一致)
    float light_intensity = light_calculator().accumulated_light.r;
    
    // 反向控制透明度:光照越强,越透明;可调整系数控制效果强度
    float final_alpha = (1.0 - light_intensity) * base_color.a;
    
    // 输出最终颜色
    COLOR = vec4(base_color.rgb, final_alpha);
}

代码说明

  1. light_calculator().accumulated_light:Godot 4中用于获取当前像素所有叠加光照的总强度,返回的vec3值在白光照下RGB通道数值一致,因此取单通道即可代表光照强度(范围0~1)。
  2. 透明度控制逻辑:1.0 - light_intensity实现了“光照越强越透明”的反向效果,如果需要更柔和的过渡或调整透明度幅度,可以修改这个公式,比如:
    • 减弱透明效果:final_alpha = (1.0 - light_intensity * 0.7) * base_color.a
    • 平滑过渡:final_alpha = smoothstep(0.0, 1.0, 1.0 - light_intensity) * base_color.a
  3. 保留原纹理透明:乘上base_color.a确保原纹理的透明区域不受光照影响,保持原有效果。

注意事项

  • 确保2D节点(如Sprite2D)的光照模式设置为Normal(默认值),这样着色器才能正确接收光照数据。
  • 若使用多光源,accumulated_light会自动累加所有光源的贡献,符合预期的多光源透明效果。
  • 关于light()函数:该函数仅用于手动叠加单个光源的颜色到COLOR,无法提供光照强度的数值,因此无法直接用来控制透明度,这也是你之前尝试无效的原因。

内容的提问来源于stack exchange,提问作者Michael Strike

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:42:14