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

Man*_*ana 4 colors sprite gdscript godot

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

node.modulate= Color(0, 50, 2,0.5)
Run Code Online (Sandbox Code Playgroud)

这样做是将整个精灵更改为新颜色,而我只想将现有颜色变成更深一点的颜色,就像我们在 Photoshop 中使用“曲线”或“色阶”所做的那样 - 但不是那么精致。任何基本的方法也会有帮助。

目前,我只能进行“颜色叠加”而不改变不透明度。 只要不改变整个精灵的不透明度而仅改变叠加颜色,任何添加具有不透明度变化的颜色叠加的方法都会有所帮助。

我正在开发一个带有导入 PNG Sprites 的 2D 游戏。如果需要更多信息,我很乐意提供。

附加信息 -

我的精灵是什么样子

在此输入图像描述

我想通过这样的代码两次使其变暗 -

在此输入图像描述 在此输入图像描述

通过执行 node.modulate= Color(0.0, 0.0, 0.0,1) ,它会变成这样 - 在此输入图像描述

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

hol*_*ola 7

色差图像示例

以下是如何通过代码使精灵变暗的两个示例。

第一种方法是使用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)
Run Code Online (Sandbox Code Playgroud)

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

着色器代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

另一个代码:

# On a node that extends CanvasItem
material.set_shader_param('difference', 0.3)
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助。