Godot 4.0如何让未被光源照亮的对象变透明而非黑色
解决方案
直接用自定义CanvasItem着色器配合Light Mask就能实现,不用调层级或全局透明度,步骤如下:
- 给你的PointLight2D设置专属Light Mask:比如只勾选第5层(选个没被其他光源占用的层就行),同时把目标图层的所有对象的Light Mask也勾选第5层——这样这个光源只会照亮目标对象。
- 给所有非目标图层的对象添加以下CanvasItem着色器:
shader_type canvas_item; void fragment() { // 获取对应Light Mask层的光源影响(这里对应第5层,和PointLight2D的设置一致) vec4 light_influence = light_get_color(5); // 处于光源范围内时,把对象设为透明;范围外保持原样 if (light_influence.r > 0.0) { COLOR.a = 0.0; // 可改成0.2这类值实现半透明 } else { COLOR = texture(TEXTURE, UV) * COLOR; } }
原理说明
light_get_color(层号)会返回当前像素受到对应Light Mask层光源的影响颜色,光源范围内返回非零值,范围外是(0,0,0,0)。- 非目标对象通过这个着色器判断:在光源覆盖区就变透明,不干扰目标对象的显示;光源外所有对象都保持默认照亮状态,完全匹配你的需求。
- 全程不用调整Canvas Layer层级,也不用全局修改透明度,完美避开之前的问题。
内容的提问来源于stack exchange,提问作者Microbob
相关产品推荐
相关产品推荐

