콘텐츠로 건너뛰기

BLEND:ATOMIC NODE :SUBSTANCE DESIGNER

BLEND:ATOMIC NODE :SUBSTANCE DESIGNER.

学习目标

  1. 学习混合像素的 SD 所有 NODE 和功能的基本知识。
  2. 理解Blend Node 的像素颜色合成式。
  3. 把两个不同图片的 RGBA 用 Split 和 Merge 生成新的图片。
  4. Channel Shuffle 和 Channel Mixer。

本章节了解下 Blend node 的混合方式,并看一下是否可以用 Mask 达到更详细的混合。

Blend Mode 的种类。

  • Copy
  • Add(Linear Dodge)
  • Subtract
  • Multiply
  • Add Sub
  • Max(Lighten)
  • Min(Darken)
  • Switch
  • Divide
  • Overay
  • Screen
  • SoftLight

总共有12种 Mode 。
看下可以直接追加制作的各种 Blend Node 。
因为美术以前主要使用的是PS,所以对 HardLighr , VividLight , PinLight , Difference 等其他 Blend mode 也很有兴趣。
介绍相关公式后,选择其中一个简单跟着制作下吧。
也可以参考后续介绍的 Pixel Processor 来跟着做。

Copy

Copy 是普通的 Linear interpolation 会混合两个信息。

SPECIFIC PARAMETERS * 
copy 
Alpha Blending
Blend 
2048 
x 2048 (Gr ysc 
- 2B VIE' 
a ale, 16bpc) 
: ți Illh

把 Opacity 设成 0.5后来看下两个 Shape 重叠的部分。

重叠的中间部分应该是正确的白色值。

Blend 
- 21) VIE' 
2048 
x 2048 (Gr ysc 
16bpc) 
x 
HISTOGRAI 
Essas 
Essas 
Essas 
A: €ssas 
/ l_oooooo 
/ l_oooooo 
/ l_oooooo 
/ l_oooooo 
2ss 
o _ oooooo 
/ o_oooooo 
/ l_oooooo 
1019 
IOS4 
o_497SS9 
o _ s14€48 
FiElE: 
2779928 (6E uS) 
0; 142 
41*4304 
48

表示鼠标指向点的色彩信息。
V 值是 RGB 值 255 , Float 值正确表示着 1.0。

看下实际颜色。

M048X2b4 一 co 
2048X204

像这样用蓝色和红色把 Shape 的白色部分填充了。

Blend 
2048x2048

但是使用 Color 确认 Blend 节点的话,就会显示中间部分减少 50%的原色的蓝色和减少50%的原色的红色各混合一半的颜色。
RGB 加算混合(RGB 加算混合)是利用光的三原色来表现颜色的方式,所以这种结果是正确的。

21) VIE' 
2048 
x 2048 (RGBA, 
127 / 
127 / 
2ss / 
abpc) 
0_498039 
o _ oooooo 
o. 498039 
l_oooooo 
300 
2ss 
127 
0_833333 
l_oooooo 
/ 0_498039 
993 
IDES 
x 
/ 0_4848€3 
/ o_S20020 
HISTOGRAI 
FiElE: 
2779928 (6E uS) 
41*4304

看下中间粉色部分的值,  Value 值是 RGB 127 , Float 值是 0.49803 。

再来详细看下 Color 颜色混合方式。

在公式里 a Blend  Background b Blend  Foreground

对 Linear Interpolation 的理解。

Linear Interpolation law 以下线性插值法是可以填充两个数字间距的技术。

大部分 API是根据始发点 a、终点 b,以及连接 0和 1 之间的值 t的分段来移动的三种变量为准来提供线性插值。

t = 0 就会回执 a。
t = 1,会返还 。
这个公式的优点是容易理解容易实现,在2D和3D都能使用。
线性插值总是回执连接 a和 b的线的点。
标准 RGB Lerp执行如下。

public static Color LerpRGB (Color a, Color b, float t)
{
	return ( a + (b - a) * t).rgba;
}Code language: PHP (php)

使用 Pixel Processor 再现了以上公式。
Pixel Processor 部分后面有说明用法,到时候再仔细看下。

V a i a b 1 e s 、 G e • 
$pos 
V ax i ab 1 e s 、 G e • 
S an p 1 e s 、 S an • • 
S an p 1 e s 、 S an • • 
input 1 
input O

制作Get Float来获取两个图片的输入和外部变量,再把这个定义成 t 。
把外部变量 t 想成 Blend 节点的 Opacity 吧。
跟普通的 Blend Weight 有点不一样。

public static Color LerpRGB (Color 
a, Color b, float t) 
return new Color( a + (b 
t). rgba; 
input 1 
$pos 
input 0

用简单的公式制作来验证下 Blend 节点的 Copy 和 Opacity 是不是正确的 Lerp 。
这里的 t 是 Opacity 的变量。
这里不要搞混了, input0 是 blend 的 foreground , input1 是 Background 。

2048х2048 - 
2048х2048 - 
2048х2048 
2048х20 
2048х2048 - 
2048х2048 
2048х2048 - 
2048х2048 - 
2048х2048 - 
Pi„1 Р., — 
2048х2048 -

两个方式都是同一个结果。
这就可以知道 Copy 使用了线性插值法的基本颜色插值法。

Add(Linear Dodge)

SPECIFIC PARAMETERS 
(Linear Dodge) 
Alpha Blending 
IN-PUT VALUES

通常叫做 Linear Dodge 。

把两个值单纯加起来。

float4 LinearDodge (float4 a, float4 b , float t)
{
	return (a*t + b).rgba;
}Code language: JavaScript (javascript)

如上函数。

I S 
u I S 
I S 
TE TSE O ' O LE T 
T 233 8 2 ' O L 8 
(odqg 'V g 
"Z | PUaIU 
011 80 I 
X gVOZ

重叠部分的颜色加起来。

float4 LinearDodge (float4 a, float4 b 
float t) 
return new color (a + b*t). rgba; 
Variables/ Ge••• 
$pos 
a : Background 
S a •p I ers/S an 
Operator / Add 
input I 
Foreground 
S a •p I ers/S an 
O erator/Sca••• 
input 0 
Variables/ Ge

在这里 t 是 Opacity 的变量。

Add (Linear 
Dodge) 
0.5 
Shape 
2048x2048 
Shape 
2048x2048 
Blend 
2048x2048 
Blend 
2048x204 
ransfor•ati 
2048x2048 
r ansf 
2048x2048 
r ansf 
Blend 
2048x2048 
Pixel Proces••• 
L 16 
L16 
2048x2048 
r ansf o 
2048x2048 
- L16 
16 
2048x2048 
Blend 
2048x2048 
L 16 
Pixel Proces••• 
1 nput 
2048x2048 
0.5

如上函数,简单从 a 减去了 b。

float4 Subtract (float4 a, float4 b , float t)
{
	return lerp(a, (a-b), t);
}Code language: JavaScript (javascript)

和 b 相乘的变量 t 是 opacity 值。

Variables/Ge 
$pos 
float4 Subtract (float4 a, 
float t) 
return (a b*t) • 
a : Background 
S a—plers/Sa•••• 
input 1 
. Foreground 
S a—plers/ San 
input 0 
Opac i ty 
Var i ables/Ge••• 
float4 
O e rat or Sca••• 
Operator/ Sub 
Comment
Subtract 
Bit 
048x2048 
048x2048 
2048x2048 
S hap e 
2048x2048 
npu 
B lend 
2048x2048 
P x e I Proc e 
B lend 
2048x2048 
Proc e s 
2048x2048

虽然上图看起来有点错误,但这是正常的。
因为使用的是完整的 Blue 和完整的 Red ,所以在 RGB 加算混合方式里 R 通道和 B 通道间是没有关联的,故不减掉任何值。

用其他贴图测试下。

Subtract 
riles 008 
2048x2048 
riles 002 
BI end 
2048x2048 
pixe 
Pro c e s 
Alpha Split 
2048x2048 
2048x2048 
Shap e 
2048x2048 
L 16 
o 
LLL. 
o 
BI end 
o 
pixel 
2048x204

可以看到 Subtract 运作正常。

只是在 Pixel Processor 的 Node 预览里没有单独对 Alpha 通道的管理系统,所以用 Alpha Split 预览了。

Multiply

float4 Multiply (float4 a, float4 b , float t)
{
	return lerp(a, (a*b), t);
}Code language: JavaScript (javascript)
Multiply 
2048x2048 
2048x2048 
L16 
L16 
Transfor•ati 
O 
2048x2048 
Transfor•ati 
o 
2048x2048 
O 
2048x2048 
Pixel Proces•• 
2048x2048 
L16 
L16 
L16 
1 n pu
Variables/ Ge 
$pos 
float4 Multiply (float4 a, 
float t) 
return (a * (b*t)) ; 
a : Background 
S ler s/ San 
input I 
: Foreground 
S a—plers/ San 
input 0 
Opacity 
Vari ables/Ge 
float4 b 
Oper ator/uul 
O e rat or Sca•••

Add Sub

混合两个高度值的结果很独特,在 Opacity 中间值也可以做出不一样的造型。

float4 AddSub (float4 a, float4 b , float t)
{
	return  lerp(a, (b-1)+(b+a) , t);
}Code language: JavaScript (javascript)
Add 
( Sub 
2048x2048 
L 16 
2048x2048 
L 16 
in put 
15 
Pixel Proces 
2048x2048
Add Sub 
float4 AddSub (float4 a, float4 b 
return lerp (a, (b+a) 
$pos 
input 1 
$pos 
input 0 
float 
Opac i ty 
Comment

Max(Lighten)

float4 Lighten (float4 a, float4 b , float t)
{
	return  max(a, b*t);
}Code language: JavaScript (javascript)
Max (Lighten) 
2048x2048 
2048x2048 
L16 
L16 
ansfor•at• 
2048x2048 
ransfor•at• 
2048x2048 
L16 
L16 
2048x2048 - L16 
Pixel Proces•• 
2048x2048
(float4 a, 
b*t) ; 
$pos 
float4 Lighten 
float t) 
re turn max (a, 
a : Background 
input 1 
b : Foreground 
input 0 
Opaci ty 
Vari e•• 
float4 b 
max 
Op e r 'Sc a

Min(Darken)

float4 Darken (float4 a, float4 b , float t)
{
	return min(a,  b * t);
}Code language: JavaScript (javascript)
Min (Darken) 
Shape 
2048x2048 
Transformati•• 
L16 
2048x2048 
Transformati 
O 
2048x2048 
L16 
L16 
L16 
1 n pu 
B 1 end 
O 
2048x2048.Æ16 
Pixel Proces•• 
2048x2048 
Shape 
2048x2048
(float4 a, 
Variables/ Ge••• 
$pos 
Min (Darken) 
float4 Darken 
float t) 
return min (a, 
a : Background 
S a—plers/Sa• 
input I 
b : Foreground 
S a—pl e r s/ S an " • 
input 0 
Opacity 
Variables/ Ge 
float4 b 
Function/lin••• 
min 
O era tor Sca•••

Divide

颜色模式和单色模式的内部代码需要根据 Divide 的特性构成。

Color Mode

float4 Divide (float4 a, float4 b , float t) 
{
	return lerp(a ,(a/b), t);
}Code language: JavaScript (javascript)

Gray Mode

float Divide (float a, float b , float t) 
{
	float clampedA = clamp(a , 0.01 , 1)
	float clampedB = clamp(b , 0.01 , 1)
	return lerp(a ,(a/b), t);
}Code language: JavaScript (javascript)
Divide 
float4 Divide 冖 float4 a, float4 b 
2048X2 
20 
return ler 冖 冖 a 丶 丶 b 一 
2048X2048 
2048X2048 
Fabric 002 
L16 
C8 
C8 
2048X20 
float t) 
20 48X20 48 
2048 X2048 
2048X2048 
2048X2048 
B 1 
| C 16 
L16
float4 b 
$pos 
float4 Divide (float4 a, 
float t) 
return lerp (a , (a/ b), 
a : Background 
input 1 
b : Foreground 
input 0 
t : Opacity
Color mode pixel processor graph
Gray Mode 
clamp (x, min, max) 
Refer function 
float Divide (float a, float b , 
float t) 
$pos 
$pos 
float clampedA 
float clampedB 
return lerp (a 
saw ler 
input 1 
swi 
input 0 
o. 01 
clamp (a 
o. 01 
clamp (b 
o. 01 
c 1 amp 
c 1 amp 
Liu— 
Opacity 
erp
Gray mode pixel processor graph

Difference

float4 Difference (float4 a, float4 b, float t)
{
	return (abs(a - b*t));
}Code language: JavaScript (javascript)
Difference 
Shape 
2048x2048 
Transformati 
2048x2048 
2048x2048 
İnput 
8 
L16 
16
a, 
Var e " • 
$pos 
float4 Difference (float4 
float t) 
return (abs (a 
a : Background 
S a—plers/ San 
input I 
Foreground 
S a •pl ers/Sa•••• 
Positi on 
input 0 
Opacity 
Variables/ Ge 
float4 
b, 
O erator/Sub••• 
Comment 
Funct ion/ Ab s • • • 
O e rat or Sca•••

Overay

float4 Overlay (float4 a, float4 b)
{
	float isLessOrEq = step(a, 0.5);
	float4 cNew = lerp(2 * b*a, 1 - (1 - 2*(a - 0.5))*(1 - b), isLessOrEq);
	cNew.a = 1.0;
	return cNew;
}Code language: JavaScript (javascript)

Screen

float4 Softlight(float4 a , float4 b , float t)
{
	Float4 cNew =  (b < 0.5) ? (2.0 * a * b + a * a * (1.0 - 2.0 * b)) : 
	(sqrt(a) * (2.0 * b - 1.0) + 2.0 * a * (1.0 - b));
	return (a , cNew , t);
}Code language: JavaScript (javascript)

其他一些算法…

ColorBurn

float4 ColorBurn (float4 a, float4 b, float t)
{
	return (1 - (1 - a) / (b*t));
}Code language: JavaScript (javascript)

LinearBurn

float4 LinearBurn (float4 a, float4 b, float t)
{
	return (a + b*t - 1);
}Code language: JavaScript (javascript)

HardLight

float4 HardLight (float4 a, float4 b, float t)
{
	float4 valueB = b * t;
	float isLessOrEq = step(valueB, .5);
	float4 cNew = lerp(1 - (1 - a)*(1 - 2*valueB), 2*valueB*a, isLessOrEq);
	return cNew;
}Code language: JavaScript (javascript)

VividLight

float4 VividLight (float4 a, float4 b, float t)
{
	float4 valueB = b * t;
	float isLessOrEq = step(valueB, .5);
	float4 cNew = lerp(1 - (1 - a)/(2*(valueB - .5)), a/(1 - 2*valueB), isGreaterThen);
	return cNew;
}Code language: JavaScript (javascript)

LinearLight

float4 LinearLight (float4 a, float4 b, float t)
{
	float4 valueB = b * t;
	float isLessOrEq = step(valueB, .5);
	float4 cNew = lerp(a + 2*(valueB - .5), a + 2*valueB - 1., isLessOrEq);
	return cNew;
}Code language: JavaScript (javascript)

PinLight

float4 PinLight (float4 a, float4 b, float t)
{
	float4 valueB = b * t;
	float isLessOrEq = step(b, .5);
	float4 cNew = lerp(max(a, 2*(b - .5)), min(cBase, 2*b), isLessOrEq);
	return cNew;
}Code language: JavaScript (javascript)

Exclusion

float4 Exclusion (float4 a, float4 b, float t)
{
	return (.5 - 2 * (a - .5) * (b*t - .5));
}Code language: JavaScript (javascript)

태그:

댓글 남기기

%d 블로거가 이것을 좋아합니다: