我需要改变戈多中节点的色调(使用代码)。似乎没有任何简单的方法(如module.hue)这样做。我遗漏了什么吗?如果这是不可能的,我如何能够轻松地将HSB值转换为RGB值?谢谢!
发布于 2022-02-19 22:52:19
如果您想要修改CanvasItem的HSB,我们将制作一个着色器。在CanvasItem的材料槽(Control或Node2D)上添加一个Shader,并给它一个新的Shader,代码如下:
shader_type canvas_item;
uniform float hue : hint_range(0.0, 6.283185) = 0.0;
uniform float saturation : hint_range(0.0, 1.0) = 1.0;
uniform float value : hint_range(0.0, 1.0) = 1.0;
void fragment()
{
// Original Color
COLOR = texture(TEXTURE,UV);
vec3 color = COLOR.rgb;
float alpha = COLOR.a;
// Convert to YIQ space
mat3 RGB_to_YIQ = mat3(
vec3(0.2989, 0.5959, 0.2115),
vec3(0.5870, -0.2774, -0.5229),
vec3(0.1140, -0.3216, 0.3114)
);
color = RGB_to_YIQ * color;
// Apply hue rotation
float sin_hue = sin(hue);
float cos_hue = cos(hue);
mat3 hue_rotation = mat3(
vec3(1.0, 0.0, 0.0),
vec3(0.0, cos_hue, -sin_hue),
vec3(0.0, sin_hue, cos_hue)
);
color = hue_rotation * color;
// Apply saturation
mat3 saturation_scale = mat3(
vec3(1.0, 0.0, 0.0),
vec3(0.0, saturation, 0.0),
vec3(0.0, 0.0, saturation)
);
color = saturation_scale * color;
// Apply value
mat3 value_scale = mat3(
vec3(value, 0.0, 0.0),
vec3( 0.0, value, 0.0),
vec3( 0.0, 0.0, value)
);
color = value_scale * color;
// Convert back to RGB space
color = inverse(RGB_to_YIQ) * color;
// Output
COLOR = vec4(color, alpha);
}这段代码可以进一步优化。例如,我们可以对inverse(RGB_to_YIQ)进行硬编码,而不是每次计算它(您可以利用符号或类似的软件来计算它)。
顺便说一句,戈多创始人胡安·利涅茨基也剪切了一些色调旋转(https://github.com/godotengine/godot-proposals/issues/96#issuecomment-534171983)的着色代码。
我是怎么做到的?
我开始寻找从RGB到HSB的转换,结果建议HSV代替。然后我在HSB的定义上发现,很明显,HSB和HSV是一样的。维基百科在文章https://en.wikipedia.org/wiki/HSL_and_HSV中也有同样的说法。
然后,为了寻找RGB和HSV之间的转换,我找到了一种在本文中应用转换的方法:仿射HSV色彩处理。它的工作方式是将RGB颜色转换为YIQ空间,然后在YIQ空间上应用转换并将其转换回RGB。
一开始它没能正常工作。我得到了一个紫色的效果,而不是预期的灰阶,饱和度设置为零。结果我把矩阵转了过来。
顺便说一下,我在上面代码中使用的矩阵的值来自另一篇文章:我的第一个矩阵,RGB,YIQ和颜色立方体。
还请参阅文章YIQ (这里还有其他可能使用的矩阵)。
顺便说一句,如果您想要从HSV创建一个Color,您可以使用Color.from_hsv方法。要获得HSV,您可以使用h、s和v属性。您可以参考https://github.com/godotengine/godot/blob/3.x/core/color.cpp来了解它的工作方式。
我还想指出,modulate是乘法的。它的行为就像一个滤色器。因此,它不能做色调旋转或改变饱和度。如果要在HSV中指定modulate,则检查面板中的颜色选择器具有该选项。
https://stackoverflow.com/questions/71188156
复制相似问题