Hue 节点
描述
使输入 In 的色调偏移输入 Offset 的大小。可使用参数 Range 设置偏移的单位。Offset 以 Degrees 为单位时介于 -180 到 180 范围内。以 Radians 为单位时介于 -Pi 到 Pi 范围内。
端口
名称 | 方向 | 类型 | 绑定 | 描述 |
---|---|---|---|---|
In | 输入 | 矢量 3 | 无 | 输入值 |
Offset | 输入 | Float | 无 | 色调偏移量 |
Out | 输出 | 矢量 3 | 无 | 输出值 |
控件
名称 | 类型 | 选项 | 描述 |
---|---|---|---|
Range | 下拉选单 | Degrees、Radians | 用于输入 Offset 的单位 |
生成的代码示例
以下示例代码表示此节点在每个 Base 模式下的一种可能结果。
Degrees
void Unity_Hue_Degrees_float(float3 In, float Offset, out float3 Out)
{
float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
float4 P = lerp(float4(In.bg, K.wz), float4(In.gb, K.xy), step(In.b, In.g));
float4 Q = lerp(float4(P.xyw, In.r), float4(In.r, P.yzx), step(P.x, In.r));
float D = Q.x - min(Q.w, Q.y);
float E = 1e-10;
float3 hsv = float3(abs(Q.z + (Q.w - Q.y)/(6.0 * D + E)), D / (Q.x + E), Q.x);
float hue = hsv.x + Offset / 360;
hsv.x = (hue < 0)
? hue + 1
: (hue > 1)
? hue - 1
: hue;
float4 K2 = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
float3 P2 = abs(frac(hsv.xxx + K2.xyz) * 6.0 - K2.www);
Out = hsv.z * lerp(K2.xxx, saturate(P2 - K2.xxx), hsv.y);
}
Radians
void Unity_Hue_Radians_float(float3 In, float Offset, out float3 Out)
{
float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
float4 P = lerp(float4(In.bg, K.wz), float4(In.gb, K.xy), step(In.b, In.g));
float4 Q = lerp(float4(P.xyw, In.r), float4(In.r, P.yzx), step(P.x, In.r));
float D = Q.x - min(Q.w, Q.y);
float E = 1e-10;
float3 hsv = float3(abs(Q.z + (Q.w - Q.y)/(6.0 * D + E)), D / (Q.x + E), Q.x);
float hue = hsv.x + Offset;
hsv.x = (hue < 0)
? hue + 1
: (hue > 1)
? hue - 1
: hue;
// HSV to RGB
float4 K2 = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
float3 P2 = abs(frac(hsv.xxx + K2.xyz) * 6.0 - K2.www);
Out = hsv.z * lerp(K2.xxx, saturate(P2 - K2.xxx), hsv.y);
}