首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改戈多节点的HSB?

更改戈多节点的HSB?
EN

Stack Overflow用户
提问于 2022-02-19 18:56:03
回答 1查看 308关注 0票数 1

我需要改变戈多中节点的色调(使用代码)。似乎没有任何简单的方法(如module.hue)这样做。我遗漏了什么吗?如果这是不可能的,我如何能够轻松地将HSB值转换为RGB值?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2022-02-19 22:52:19

如果您想要修改CanvasItem的HSB,我们将制作一个着色器。在CanvasItem的材料槽(ControlNode2D)上添加一个Shader,并给它一个新的Shader,代码如下:

代码语言:javascript
复制
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,您可以使用hsv属性。您可以参考https://github.com/godotengine/godot/blob/3.x/core/color.cpp来了解它的工作方式。

我还想指出,modulate是乘法的。它的行为就像一个滤色器。因此,它不能做色调旋转或改变饱和度。如果要在HSV中指定modulate,则检查面板中的颜色选择器具有该选项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71188156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档