目录
Artistic Nodes:艺术节点
1 Adjustment: 调校
2 Blend:混合
3 Filter:过滤
4 Mask:遮罩
5 Normal:法线
6 Utility:实用
Channel Mixer——通道混合:控制输入的每个通道对输出的每个通道的贡献。节点上的滑块参数控制每个输入通道的贡献。toggle按钮参数控制当前正在编辑的输出通道。滑块控件,用于编辑-2到2之间的每个输入通道的贡献。
_ChannelMixer_Red = float3 (OutRedInRed, OutRedInGreen, OutRedInBlue);
_ChannelMixer_Green = float3 (OutGreenInRed, OutGreenInGreen, OutGreenInBlue);
_ChannelMixer_Blue = float3 (OutBlueInRed, OutBlueInGreen, OutBlueInBlue);
void Unity_ChannelMixer_float(float3 In, float3 _ChannelMixer_Red,
float3 _ChannelMixer_Green, float3 _ChannelMixer_Blue, out float3 Out)
{
Out = float3(dot(In, _ChannelMixer_Red), dot(In, _ChannelMixer_Green), dot(In, _ChannelMixer_Blue));
}
Contrast——对比:根据输入对比度的大小调整输入的对比度。对比度值1将返回未更改的输入。如果对比值为0,则返回输入的中点。
void Unity_Contrast_float(float3 In, float Contrast, out float3 Out)
{
float midpoint = pow(0.5, 2.2);
Out = (In - midpoint) * Contrast + midpoint;
}
Hue——色调:通过输入偏移量来补偿输入的色调。偏移量的单位可以用参数范围来设置。以度为单位的偏移量在-180到180之间。在弧度中是-π到π。
度:
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);
}
幅度:
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);
}
Invert Colors——反色:在每个通道的基础上反转输入的颜色。此节点假设所有输入值都在0 - 1范围内。
float2 _InvertColors_InvertColors = float4(Red, Green, Blue, Alpha);
void Unity_InvertColors_float4(float4 In, float4 InvertColors, out float4 Out)
{
Out = abs(InvertColors - In);
}
Red、Green、Blue、Alpha由界面Toggle确定的,选择了则为1,否则为0。
Replace Color——替换颜色:将(In)中的等于(From )的值替换为(To)中设置的值。输入范围可用于定义范围更广的From的值,用于替换。输入的模糊度可以用来软化选区周围的边缘,类似于抗锯齿。
void Unity_ReplaceColor_float(float3 In, float3 From, float3 To, float Range, float Fuzziness, out float3 Out)
{
float Distance = distance(From, In);
Out = lerp(To, In, saturate((Distance - Range) / max(Fuzziness, e-f)));
}
Saturation——饱和度:根据输入饱和度的大小调整输入的饱和度。饱和度值为1时,将返回未改变的输入。如果饱和值为0,则返回完全去饱和的输入。
void Unity_Saturation_float(float3 In, float Saturation, out float3 Out)
{
float luma = dot(In, float3(0.2126729, 0.7151522, 0.0721750));
Out = luma.xxx + Saturation.xxx * (In - luma.xxx);
}
White Balance——白平衡:通过输入温度和色彩的量分别调节输入的温度和色彩。温度会使数值向黄色或蓝色移动。色调有向粉红色或绿色转变的效果。
void Unity_WhiteBalance_float(float3 In, float Temperature, float Tint, out float3 Out)
{
// Range ~[-1.67;1.67] works best
float t1 = Temperature * 10 / 6;
float t2 = Tint * 10 / 6;
// Get the CIE xy chromaticity of the reference white point.
// Note: 0.31271 = x value on the D65 white point
float x = 0.31271 - t1 * (t1 < 0 ? 0.1 : 0.05);
float standardIlluminantY = 2.87 * x - 3 * x * x - 0.27509507;
float y = standardIlluminantY + t2 * 0.05;
// Calculate the coefficients in the LMS space.
float3 w1 = float3(0.949237, 1.03542, 1.08728); // D65 white point
// CIExyToLMS
float Y = 1;
float X = Y * x / y;
float Z = Y * (1 - x - y) / y;
float L = 0.7328 * X + 0.4296 * Y - 0.1624 * Z;
float M = -0.7036 * X + 1.6975 * Y + 0.0061 * Z;
float S = 0.0030 * X + 0.0136 * Y + 0.9834 * Z;
float3 w2 = float3(L, M, S);
float3 balance = float3(w1.x / w2.x, w1.y / w2.y, w1.z / w2.z);
float3x3 LIN_2_LMS_MAT = {
3.90405e-1, 5.49941e-1, 8.92632e-3,
7.08416e-2, 9.63172e-1, 1.35775e-3,
2.31082e-2, 1.28021e-1, 9.36245e-1
};
float3x3 LMS_2_LIN_MAT = {
2.85847e+0, -1.62879e+0, -2.48910e-2,
-2.10182e-1, 1.15820e+0, 3.24281e-4,
-4.18120e-2, -1.18169e-1, 1.06867e+0
};
float3 lms = mul(LIN_2_LMS_MAT, In);
lms *= balance;
Out = mul(LMS_2_LIN_MAT, lms);
}
Blend——混合:使用mode参数定义的混合模式将(Blend)输入的值混合到(Base )输入的值上。混合的强度由输入不透明度(Opacity)决定。不透明度值为0将返回未更改的输入基。
mode类型太多,具体的不想写:
Burn, Darken, Difference, Dodge, Divide, Exclusion, HardLight, HardMix, Lighten, LinearBurn, LinearDodge, LinearLight, LinearLightAddSub, Multiply, Negation, Overlay, PinLight, Screen, SoftLight, Subtract, VividLight, Overwrite
Dither——颤振:抖动是一种用于随机量化误差的有意形式的噪声。它是用来防止大规模的模式,如在图像中的彩色带。抖动节点在屏幕空间中进行抖动,保证图形的均匀分布。这可以通过将另一个节点连接到输入屏幕位置进行调整。
此节点通常用作主节点上的Alpha剪辑阈值的输入,以使不透明对象具有透明的外观。这对于创建看起来透明但具有渲染为不透明的优势的对象很有用,比如写入深度和/或延迟渲染。
void Unity_Dither_float4(float4 In, float4 ScreenPosition, out float4 Out)
{
float2 uv = ScreenPosition.xy * _ScreenParams.xy;
float DITHER_THRESHOLDS[16] =
{
1.0 / 17.0, 9.0 / 17.0, 3.0 / 17.0, 11.0 / 17.0,
13.0 / 17.0, 5.0 / 17.0, 15.0 / 17.0, 7.0 / 17.0,
4.0 / 17.0, 12.0 / 17.0, 2.0 / 17.0, 10.0 / 17.0,
16.0 / 17.0, 8.0 / 17.0, 14.0 / 17.0, 6.0 / 17.0
};
uint index = (uint(uv.x) % 4) * 4 + uint(uv.y) % 4;
Out = In - DITHER_THRESHOLDS[index];
}
Channel Mask——通道遮罩:遮罩的输入值在通道上选定的下拉通道。输出与输入向量长度相同的向量,但所选通道设置为0。下拉菜单中的可用通道表示输入中的通道数量。
void Unity_ChannelMask_RedGreen_float4(float4 In, out float4 Out)
{
Out = float4(0, 0, In.b, In.a);
}
Color Mask——颜色遮罩:从输入值中创建掩码,其颜色与输入掩码颜色相同。输入范围可用于定义更大范围的值,以围绕输入掩码颜色来创建掩码。该范围内的颜色将返回1,否则节点将返回0。输入的模糊度可以用来软化选区周围的边缘,类似于抗锯齿。
void Unity_ColorMask_float(float3 In, float3 MaskColor, float Range, float Fuzziness, out float4 Out)
{
float Distance = distance(MaskColor, In);
Out = saturate(1 - (Distance - Range) / max(Fuzziness, 1e-5));
}
Normal Blend——混合法线:将输入A和B定义的两个法线贴图混合在一起,对结果进行规范化,以创建有效的法线贴图。
Default
void Unity_NormalBlend_float(float3 A, float3 B, out float3 Out)
{
Out = normalize(float3(A.rg + B.rg, A.b * B.b));
}
Reoriented
void Unity_NormalBlend_Reoriented_float(float3 A, float3 B, out float3 Out)
{
float3 t = A.xyz + float3(0.0, 0.0, 1.0);
float3 u = B.xyz * float3(-1.0, -1.0, 1.0);
Out = (t / t.z) * dot(t, u) - u;
}
Normal From Height——从高度获得法线:Input输入定义的高度值创建法线贴图。
Tangent
void Unity_NormalFromHeight_Tangent(float In, out float3 Out)
{
float3 worldDirivativeX = ddx(Position * 100);
float3 worldDirivativeY = ddy(Position * 100);
float3 crossX = cross(TangentMatrix[2].xyz, worldDirivativeX);
float3 crossY = cross(TangentMatrix[2].xyz, worldDirivativeY);
float3 d = abs(dot(crossY, worldDirivativeX));
float3 inToNormal = ((((In + ddx(In)) - In) * crossY) + (((In + ddy(In)) - In) * crossX)) * sign(d);
inToNormal.y *= -1.0;
Out = normalize((d * TangentMatrix[2].xyz) - inToNormal);
Out = TransformWorldToTangent(Out, TangentMatrix);
}
World
void Unity_NormalFromHeight_World(float In, out float3 Out)
{
float3 worldDirivativeX = ddx(Position * 100);
float3 worldDirivativeY = ddy(Position * 100);
float3 crossX = cross(TangentMatrix[2].xyz, worldDirivativeX);
float3 crossY = cross(TangentMatrix[2].xyz, worldDirivativeY);
float3 d = abs(dot(crossY, worldDirivativeX));
float3 inToNormal = ((((In + ddx(In)) - In) * crossY) + (((In + ddy(In)) - In) * crossX)) * sign(d);
inToNormal.y *= -1.0;
Out = normalize((d * TangentMatrix[2].xyz) - inToNormal);
}
Normal Strength——法线强度:根据输入的强度的大小调整由In输入定义的法线贴图的强度。强度值1将返回未更改的输入。强度值为0将返回一个空白法线贴图。
void Unity_NormalStrength_float(float3 In, float Strength, out float3 Out)
{
Out = {precision}3(In.rg * Strength, lerp(1, In.b, saturate(Strength)));
}
Normal Unpack——法线解码:解压由input In定义的法线贴图。此节点用于在其纹理导入设置中解压定义为法线贴图的纹理,将其采样为默认纹理。
注意,在大多数情况下,这个节点是不必要的,因为在使用纹理样本2D或Triplanar节点进行采样时,法线贴图的类型参数应该设置为法线。
Tangent
void Unity_NormalUnpack_float(float4 In, out float3 Out)
{
Out = UnpackNormalmapRGorAG(In);
}
Object
void Unity_NormalUnpackRGB_float(float4 In, out float3 Out)
{
Out = UnpackNormalmapRGB(In);
}
Colorspace Conversion——颜色控件转换:返回将输入的值从一个colorspace空间转换为另一个colorspace空间的结果。要从和到转换的空间由节点上的下拉列表的值定义。