如何在 Godot 中改变精灵的饱和度和叠加

How to change the saturation and overlay of a sprite in Godot

我一直在计划通过改变饱和度和色调值来将我的 sprite 颜色更改为更深一点的颜色。但这样做似乎非常棘手,因为 Godot 模块只讨论通过 modulate 选项更改精灵的颜色,如下所示:

node.modulate= Color(0, 50, 2,0.5)

这样做是将整个精灵更改为一种新颜色,而我只想将现有颜色设为更深一点的颜色,就像我们在 Photoshop 中使用的方式 "Curves" 或 "Levels" - 但没有那么精致。任何基本的方法也会有所帮助。

目前我只能"Color Overlay"不改变不透明度。 任何添加不透明度变化的颜色叠加层的方法都会有所帮助,只要它不改变整个精灵的不透明度,而只是改变叠加层颜色。

我正在使用导入的 PNG 精灵制作 2D 游戏。如果需要更多信息,我很乐意提供。

附加信息 -

我的精灵是什么样的

我想像这样通过代码使它变暗两次 -

通过 node.modulate= Color(0.0, 0.0, 0.0,1) 它变成这样 -

我之所以避免手动执行此操作,是因为我的精灵太多,对所有精灵都执行此操作会很乏味。

这里有两个示例,说明如何通过代码使精灵变暗。

第一种方法是使用self_modulate。通过将调制值乘以纹理颜色值来计算调制。这表明 (1, 1, 1, 1) 的调制与原始纹理相同。 (0.5, 0.5, 0.5, 1) 的调制将纹理颜色减半,使其更暗,就像它具有半不透明的黑色覆盖层一样。

# On a node that extends CanvasItem
self_modulate = Color(0.5, 0.5, 0.5, 1.0)

第二种方法是将纹理值减去一个常数。这会创建更饱和但更暗的纹理。

着色器代码:

shader_type canvas_item;

uniform float difference: hint_range(0.0, 1.0) = 0.0;

void fragment() {
    vec4 tex = texture(TEXTURE, UV);
    COLOR.rgb = tex.rgb - vec3(difference);
    COLOR.a = tex.a;
}

其他代码:

# On a node that extends CanvasItem
material.set_shader_param('difference', 0.3)

可以组合这些效果以产生所需的结果。尝试使用着色器以产生更好的结果。

希望对您有所帮助。