TECHARTNOMAD | TECHARTFLOWIO.COM

SUBSTANCE

BITMAP & BLEND NODE COMPOSITION :: ATOMIC NODE

jplee 2023. 5. 19. 23:05

SD 사용 하기 위한 가장 근본이 되는 NODE 의미 한다.

 

Graph canvas  상단 메뉴에 Icon 으로 위치 하고 있으며 Tab 키를 눌러 canvas 위에서 바로 호출  수도 있다.

Tab 키를 누르면 마우스 커서 위치를 기준으로 메뉴가 펼처 진다.

기본적으로 Atomic node 나타나며 Search 사용 하여 SD 에서 제공 하는 모든 Node(Filter,Material,Function,Bitmap) 호출 있다.

 

차례 차례 Atomic node 살펴 보자.

 

외부로 부터 Link 이미지 또는 Sbs 파일 안으로 import 이미지를 불러 Graph editor 불러 옵니다.

 

아이콘을 클릭 하면 From File… 또는 From New Resource… 처럼 메뉴가 나타난다.

From File 완전히 외부로 부터 이미지를 불러 온다.

From File…

외부에 저장 비트맵 이미지를 불러 온다.

 

이미지를 선택 하고 열기 하면 위와 같은 선택창이 뜬다.

  • Link resource(s) : 외부 저장 경로를 유지 하고 이미지를 불러 온다.
  • Import resource(s) : SBS 프로젝트가 저장 경로의 Dependency Directory 하나 생성 하고 안에 저장 한다.

From New Resource…

 

 사용자가 설정 해상도를 갖는 단색 이미지(Bitmap) 파일을 생성 한다.

외부에서 비트맵이미지를 Import 불러왔고 빨간색 비트맵이미지는 Substance designer 에서 생성 하였다.

 

Import 비트맵 이미지와 직접 생성한 비트맵 모두 이런 식으로 프로젝트이름.resources 라는 디렉토리가 생성 되고 안에 따로 저장 된다.

동료에게 sbs 프로젝트를 일반적으로 복사 함께 제공 줘야 한다.

 

이럴 경우 그림 처럼 Export with dependencies… 묶어 주면 문제 없다.

하지만 여러 중복 sbs 필터들이 함께 딸려 가기 때문에 간단한 작업의 경우나 또는 이미 공용 filter 들이 동료에게 모두 있다면 필요 파일들만 복사 해서 주는 것이 좋다.

이와 관련 자세한 사항은 실무 제작 Workflow 설명에서 상세하게 다루겠다.

 

 

일반적인 활용 방안.

  1. 인터넷 또는 직접 촬용한 이미지등을 Graph 불러 온다.
  2. Bake 텍스처들은 Graph 에서 모두 Bitmap node 사용 하게 된다.
  3. Tiling 끄고 사용 경우 특정 상표등을 로고 또는 마크 등을 오브젝트 표면에 Print 사용 한다.

 

BLEND NODE COMPOSITION

학습목표./学习目标

  1. 픽셀을 혼합 하는 SD 모든 NODE 기능에 대한 기본 지식을 습득 한다./ 学习混合像素的 SD 所有 NODE 和功能的基本知识。
  2. Blend Node 픽셀 색상 합성식을 이해한다./ 理解Blend Node 的像素颜色合成式。
  3. 개의 서로 다른 이미지의 RGBA Split Merge 사용하여 새로운 이미지를 생성 한다./ 把两个不同图片的 RGBA Split Merge 生成新的图片。
  4. Channel Shuffle Channel Mixer./ Channel Shuffle Channel Mixer

 

이번 장에서는 Blend node 혼합 방식을 알아 보고 Mask 사용 하여 상세한 혼합에 도달 있는지 살펴 보자.
本章节了解下 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 함께 살펴 보기로 하자.

미술가는 전에 포토샵을 주로 사용 했었기 때문에 HardLighr , VividLight , PinLight , Difference 등과 같은 다른 Blend mode  에도 관심이 많은 같다.

관련된 수식을 소개 하고 하나를 선택 해서 간단히 따라 하기 식으로 제작 보자.

뒤에서 소개 하고 있는 Pixel Processor 참고 하면서 따라 해도 좋다.

 

Copy

Copy 아주 일반적인 Linear interpolation 으로 정보를 혼한 합니다.

 

 

Opacity 0.5 설정 Shape 겹친 부분을 보자.

겹처진 가운데 부분은 정확히 백색 값을 취하고 있을 것이다.

 

 

마우스 커서가 가리키고 있는 지점의 색상 정보를 표시 하고 있다.

V 값이 RGB 255 이며 Float 값으로 정확히 1.0 표시 하고 있다.

 

실제 색상으로 살펴 보자.

이런식으로 파란색과 빨강색으로 Shape 흰색 부분을 채워 주었다.

 

 

 

하지만 Color 사용 하여 Blend 노드를 확인 하면 가운데 부분이 50퍼센트 감소한 원색상의  파란색과 50퍼센트 감소한 원색상 빨간색을 절반씩 혼합 색상이 나올 것이다.

RGB 가산혼합(RGB 加算混合) 빛의 삼원색 이용하여 색을 표현하는 방식이기 때문에 이러한 결과가 나오는 것이 옳다.

 

 

가운데 분홍색 부분의 값을 보면  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이면 대신 반환됩니다.

공식의 장점은 이해하기 쉽고 구현하기 쉽고 2차원 3차원 모두에서 작동한다는 것입니다.

선형보간 항상 a b 연결하는 선의 점을 반환합니다.

표준 RGB Lerp 다음과 같이 수행 있습니다.

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

Pixel Processor 사용 하여 위의 식을 그대로 재현 봤다.

Pixel Processor 부분은 뒤에서 어떻게 사용 것인지 설명 두었으니 그때 다시 살펴 것이다.

 

개의 이미지 입력과 외부 변수를 받아오는 Get Float 만들고 이것을 t  라고 정의 하자.

외부 매개변수 t Blend 노드의 Opacity 라고 생각 하자.

보편적인 Blend Weight 조금 다르다.

간단한 수식 만들기로 Blend 노드의 Copy Opacity 정확히 Lerp 인지 검증 하자.

여기서 t Opacity 매개변수 이다.

여기서 햇갈리지 않아야 것은 input0 blend foreground 이고 input1 Background 라는 점이다.
 

 

형식 모두 같은 결과를 보인다.

이로서 Copy 선형보간법을 사용 하는 기본적인 색상 보간법을 사용 하는 것이 확인 됬다.

 

Add(Linear Dodge)

 

일반적으로 Linear Dodge 라고 합니다.

값을 순수하게 더합니다.

float4 LinearDodge (float4 a, float4 b , float t)
{
	return (a*t + b).rgba;
}

겹치는 부분의 색상을 더합니다.

 

여기서 t Opacity 매개변수 이다.

 

여기서 t Opacity 매개변수 이다.

 

Subtract
float4 Subtract (float4 a, float4 b , float t)
{
	return lerp(a, (a-b), t);
}

위와 같은 함수 인데 간단히 a 에서 b 빼주고 있습니다.

b 곱하고 있는 매개변수 t opacity 값입니다.

 

위와 같은 함수 인데 간단히 a 에서 b 빼주고 있습니다.

b 곱하고 있는 매개변수 t opacity 값입니다.

 

 

 

예제 이미지에서 무언가 부분이 있는 처럼 보이지만 정상적인 처리다.

완전한 Blue 완전한 Red 사용 했기 때문에 RGB 가산혼합 방식에서 R 체널과 B 체널 사이에 연관성이 없기 때문에 어떤 값도 빼지지 않는다.

 

다른 텍스처를 사용 하여 테스트 보자.

 

 

정상적으로 Subtract 동작 하는 것을 있다.

다만 Pixel Processor Node 미리보기에서 Alpha 체널에 대한 별도 관리 시스템이 없기 때문에 Alpha Split 사용 해서 미리보기 했다.

 

Multiply
float4 Multiply (float4 a, float4 b , float t)
{
	return lerp(a, (a*b), t);
}

 

 

 

 

Add Sub

높이값을 혼합 결과이 독특 하고 사며 Opacity 중간값에서 색다른 모양을 유도 있다.

float4 AddSub (float4 a, float4 b , float t)
{
	return  lerp(a, (b-1)+(b+a) , t);
}

 

 

 

 

Max(Lighten)

float4 Lighten (float4 a, float4 b , float t)
{
	return  max(a, b*t);
}

 

 

 

 

 

Min(Darken)

float4 Darken (float4 a, float4 b , float t)
{
	return min(a,  b * t);
}

Divide

Divide 특성에 의해서 컬러 모드와 단색 모드의 내부 코드는 다르게 구성 해야 한다.

Color Mode

float4 Divide (float4 a, float4 b , float t) 
{
	return lerp(a ,(a/b), t);
}

Gray Mode

참조 함수 : clamp(x, min, max)

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);
}

Color mode pixel processor graph

Gray mode pixel processor graph

 

Difference 계산식.

float4 Difference (float4 a, float4 b, float t)
{
	return (abs(a - b*t));
}

 

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;
}

Screen 계산식

float4 Screen (float4 a, float4 b, float t)
{
	return (1 - (1 - a) * (1 - b));
}

 

SoftLight 계산식

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);
}

그 외 계산식들…

//ColorBurn
float4 ColorBurn (float4 a, float4 b, float t)
{
	return (1 - (1 - a) / (b*t));
}

//LinearBurn
float4 LinearBurn (float4 a, float4 b, float t)
{
	return (a + b*t - 1);
}

//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;
}

//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;
}

//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;
}

//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;
}

//Exclusion
float4 Exclusion (float4 a, float4 b, float t)
{
	return (.5 - 2 * (a - .5) * (b*t - .5));
}

'SUBSTANCE' 카테고리의 다른 글

FX MAP :: ATOMIC NODE  (0) 2023.05.20
SHAPE :: ATOMIC NODE  (1) 2023.05.19
PREFERENCES  (0) 2023.05.19
Substance Designer USER INTERFACE  (0) 2023.05.18
Next generation graphics 와 Substance production 에 대한 단상.  (1) 2023.05.18