Posts 간단한 앰플리파이 쉐이더 예제 모음
Post
Cancel

간단한 앰플리파이 쉐이더 예제 모음

Note


  • 각 예제마다 있는 Copy & Paste 부분의 코드를 복사하고,
    앰플리파이 쉐이더 에디터에 Ctrl + V로 붙여 넣어서 곧바로 해당 노드들을 생성할 수 있습니다.


1. Vertex


Scale Up and Down

Copy & Paste

1
http://paste.amplify.pt/view/raw/a358e6ec

image


Heartbeat

Copy & Paste

1
http://paste.amplify.pt/view/raw/e6f80d1c

2021_0627_Heartbeat

1
2
3
4
5
6
( max( sin(T * F), 1-S ) - (1-S) ) * A

T : Time
F : Frequency
S : Sensitivity
A : Amplitude


World Position Offset

Copy & Paste

1
http://paste.amplify.pt/view/raw/a60cd49e

image

Copy & Paste

1
http://paste.amplify.pt/view/raw/9db1c8c7

image

  • 두 가지 방식 모두 동일한 결과를 내므로, 상황에 따라 선택하여 사용하면 된다.


World Position Offset (Keep Scale)

Copy & Paste

1
http://paste.amplify.pt/view/raw/424f7336

image

Copy & Paste

1
http://paste.amplify.pt/view/raw/8594ca25

image

  • 두 가지 방식 모두 동일한 결과를 내므로, 상황에 따라 선택하여 사용하면 된다.


Vertex Displacement

Copy & Paste

1
http://paste.amplify.pt/view/raw/740c2b24

image

2021_0630_VertexDisplacement

  • Noise Generator 노드에 UV 입력이 있다고 해서 진짜로 UV를 넣으면 안되고, 대신 Vertex Position을 넣어야 한다.


2. Color


UV Mask

Copy & Paste

1
http://paste.amplify.pt/view/raw/aa65fd76

image

  • StepA, B 입력을 서로 바꿀 경우, 마스크 색상 반전


Smooth UV Mask

Copy & Paste

1
http://paste.amplify.pt/view/raw/3bb6c48c

2021_0813_UV_SmoothMask

Copy & Paste

1
http://paste.amplify.pt/view/raw/7cdbac84

2021_0627_UV_Mask_Smooth

  • SmoothstepMin, Max 입력을 서로 바꿀 경우, 마스크 색상 반전


UV Mask Dissolve

Copy & Paste

1
http://paste.amplify.pt/view/raw/29a6c1c6

2021_0813_UV_NoiseMask

Copy & Paste

1
http://paste.amplify.pt/view/raw/110696fe

2021_0627_UV_Mask_Dissolve


Noise Dissolve

Copy & Paste

1
http://paste.amplify.pt/view/raw/077b71e9

image


UV Circle

Copy & Paste

1
http://paste.amplify.pt/view/raw/4ff3eee1

image


Smooth UV Circle

Copy & Paste

1
http://paste.amplify.pt/view/raw/2baa9e89

image


Clock Mask

Copy & Paste

1
http://paste.amplify.pt/view/raw/e7eae5d7

2021_0813_UV_ClockMask


Radar

Copy & Paste

1
http://paste.amplify.pt/view/raw/ac8d6699

2021_0813_UV_Radar


Checkerboard

Copy & Paste

1
http://paste.amplify.pt/view/raw/c9e88e0d

2021_0626_CheckerBoard


Smooth Box

Copy & Paste

1
http://paste.amplify.pt/view/raw/4b5cd0ae

image


Grid

Copy & Paste

1
http://paste.amplify.pt/view/raw/1f58a1e6

image


Distortion

Copy & Paste

1
http://paste.amplify.pt/view/raw/4e552625

image

2021_0630_Distortion

  • 마스터 노드의 속성에서 Blend ModeTransparent로 지정한다.

  • 마찬가지로 General - Light ModelUnlit으로 변경한다.


World Position-Based Color Variation

Copy & Paste

1
http://paste.amplify.pt/view/raw/7a0e7c98

image

image

  • 게임 오브젝트의 현재 월드 위치를 기반으로 색상을 지정한다.

  • Distribution, Seed 프로퍼티를 이용해 다양한 연출이 가능하다.


World Position-Based Color Variation (From-To)

Copy & Paste

1
http://paste.amplify.pt/view/raw/654df77d

image

image

  • 지정한 두 색상 사이에서만 월드 위치 기반으로 색상이 분포하도록 한다.


Depth Intersection

Copy & Paste

1
http://paste.amplify.pt/view/raw/40436abe

2021_0914_Depth Inter

  • 반투명 물체가 다른 불투명 물체와 접촉한 지점을 강조하여 표현한다.

  • 대표적으로 쉴드 이펙트, 물 쉐이더 등에 사용된다.

  • Screen Position 노드의 TypeScreen으로 지정해야 한다.

  • 반드시 Blend ModeTransparent로 설정해야 한다.

  • Cast Shadows 옵션이 꺼져 있는 쉐이더(#pragma noshadow)는 Screen Depth 값이 제대로 받아와지지 않는다.

원리?

image

ScreenPosition.w는 카메라로부터 해당 메시 표면까지의 거리를 나타낸다.

ScreenDepth는 카메라로부터 가장 가까운 ‘불투명’ 물체 표면까지의 거리를 나타낸다.

따라서 같은 픽셀에서 반투명(Transparent), 불투명(Opaque) 물체가 겹쳐 있고,

반투명 물체의 표면이 카메라에 더 가까이 있는 경우

ScreenDepth - ScreenPosition.w의 값은 0보다 커진다.


이를 반대로 뒤집으면 ScreenPosition.w - ScreenDepth의 값은 0보다 작아지는데,

여기에 작은 양수 값 T(0 ~ 1 정도)를 더하면

ScreenPosition.w - ScreenDepth의 값이 얼마 차이 안나는 지점(-1 ~ 0 정도)에서만

ScreenPosition.w - ScreenDepth + T의 값이 0보다 커지게 된다.

ScreenPosition.w - ScreenDepth의 값이 얼마 차이 안나는 지점이라는 것은

접촉면에 가까운 지점을 의미한다. (0 : 완전히 맞닿는 지점)


예를 들어 T가 1일 때, 반투명과 불투명 물체가 완전히 맞닿는 부분은

ScreenPosition.w - ScreenDepth + T 값이 1이 되고,

완전히 맞닿는 부분에서 멀어질수록 위의 값은 점점 작아진다.

그리고 여기에 최종적으로 Saturate를 통해 음수를 0으로 바꿔버리면

접촉면을 강조 표현하는 쉐이더가 완성된다.


Camera Distance-Based Fade

물체는 카메라에서 멀리 떨어질수록 당연히 작게 보인다.

그런데 물체 표면에 복잡하거나 정교한 문양 또는 패턴을 표현하는 경우,

카메라에서 멀어지는데 디테일은 유지되어 자글자글하고 썩 좋지 않게 보이는 경우가 있다.

대표적인 예시로 체크 무늬가 있다.

image

카메라에 가까이 보이는 부분은 괜찮지만, 먼 부분은 보기에 별로 좋지 않다.

카메라의 거리에 따른 디테일을 조정할 때는 보통 LOD를 사용하여 거리별로 다른 품질의 텍스쳐를 적용하지만,

순수하게 수학으로 표현된 패턴이거나 혹은 모종의 이유로 LOD를 사용하지 못하는 경우가 존재한다.

이럴 때는 카메라로부터 정점 위치까지의 거리 값을 기반으로 쉐이더에서 직접 색상 전환 효과를 넣어줄 수 있다.

2021_1216_Camera Based Fade


계산은 다음과 같으며, 결과는 0 ~ 1 사이 값이 된다.

Copy & Paste

1
http://paste.amplify.pt/view/raw/900fb562

image

Camera Distance 프로퍼티는 색상을 전환할 기준이 되는 카메라로부터의 거리값,

Smoothness 프로퍼티는 두 색상이 부드럽게 섞이는 정도를 의미한다.


위 계산의 결괏값을 Lerp 노드의 Alpha 입력에 넣고,

A 입력에는 원래 색상, B 입력에는 카메라에서 지정한 거리만큼 떨어지는 경우 보여줄 색상을 넣어준다.

예제에서는 A에 체크무늬 색상, B에는 체크무늬의 두 색상의 중간 값을 넣어주었다.

ScreenshotASE


Texture Sheet Animation

  • 예제 텍스쳐 :

TextureSheet_Debug_4x3


[1] 좌측 하단부터 시작

2021_0723_TextureSheet_01

2021_0723_TextureSheet_02

  • 좌측 하단 텍스쳐 영역을 (0, 0), 우측 상단 영역을 (3, 2) 좌표로 가정한다.

  • 인덱스의 진행에 따라 (0, 0), (1, 0), (2, 0), (3, 0), (0, 1), (1, 1), … , (3, 2) 순서대로 해당되는 텍스쳐 영역을 보여준다.

  • 첫 번째 사진처럼 인덱스를 직접 지정해줄 수도 있고, 두 번째 사진처럼 시간의 흐름에 따라 자동 재생되도록 해줄 수도 있다.


[2] 좌측 상단부터 시작

2021_0723_TextureSheet_03

2021_0723_TextureSheet_04

  • 인덱스의 진행에 따라 좌상단부터 우하단 방향으로 이어진다.

  • 파티클 시스템의 Texture Sheet Animation과 같은 방식

  • 텍스쳐 시트 형태로 만들어지는 파티클 텍스쳐의 경우 이와 같이 좌상단부터 우하단 방향으로 재생된다.

  • 예제 텍스쳐의 경우, 인덱스의 진행에 따라 8 -> 9 -> 10 -> 11 -> 4 -> 5 -> 6 -> 7 -> 0 -> 1 -> 2 -> 3 순서대로 이어진다.


  • 그런데 Amplify, Shadergraph에 모두 간편하게 하나의 노드로 이미 구현되어 있으므로, 추가적인 응용이 필요한 것이 아니라면 Flipbook 노드를 사용하면 된다.

2021_0722_TextureSheetAnimation_Flipbook


3. Lighting


Lambert

Copy & Paste

1
http://paste.amplify.pt/view/raw/c0d85f09

image

  • 마스터 노드 속성 - General - Light Model - Custom Lighting 선택

  • World Normal 노드를 클릭하고, 좌측의 속성 탭에서 Normalize를 체크해야 한다.
    이름에 Normal이 들어가지만 기본적으로 정규화된 벡터가 아니다.


Blinn-Phong Specular

Copy & Paste

1
http://paste.amplify.pt/view/raw/01dc5164

image


Lambert + Blinn Phong

Copy & Paste

1
http://paste.amplify.pt/view/raw/9c68ec32

image


Diffuse Warping

Copy & Paste

1
http://paste.amplify.pt/view/raw/7daa6208

image

  • Ramp Texture를 이용한 커스텀 라이팅 기법

  • Ramp Texture는 반드시 Wrap Mode : Clamp, Filter Mode : Point로 설정해야 한다.

  • 메인 텍스쳐 색상은 AlbedoEmission이 아니라 Custom Lighting 입력 앞에 있는 Multiply 노드에 곱해주어야 한다.


2021_0628_DiffuseWarping

  • Scale And Offset 노드를 통해 각 색상의 영역을 조절해줄 수 있다.


  • 사용된 Ramp Texture :


4. Particle Shaders


Basic Particle(Additive) Shader

Copy & Paste

1
http://paste.amplify.pt/view/raw/2aaa4df2

image

General

  • Light Model : Unlit
  • Cull Mode : Off
  • Cast Shadows : Off
  • Receive Shadows : Off

Blend Mode

  • Render Type : Transparent
  • Render Queue : Transparent
  • 우측 상단 : Custom
  • Blend RGB : Particle Additive
    (Advanced options are.. 경고 문구가 뜨면 우측 상단을 Custom으로 바꾸고 설정한다.)

Depth

  • ZWrite Mode : Off

Rendering Options

  • 모두 체크 해제


Soft Particle(Additive) Shader

  • Rito_SoftParticle.zip

  • 불투명한 물체에 닿는 지점이 부드럽게 표현된다.

  • Screen Position 노드의 TypeScreen으로 설정해야 한다.

Copy & Paste

1
http://paste.amplify.pt/view/raw/b4bcf5ae

image


  • 비교 - : 기본 파티클 쉐이더 / : Soft Particle 쉐이더

image


추가 : Soft Particle이 씬 뷰에서 제대로 보이지 않는 경우 해결하기

게임 뷰에서는 제대로 보이지만, 씬 뷰에서는 다른 불투명 오브젝트에 무조건 가려지는 경우가 있다.

그럴 때는 다음과 같이 Static Switch 노드를 추가하고,

Copy & Paste

1
http://paste.amplify.pt/view/raw/e28bff4b

image

Static Switch 노드는 아래처럼 설정하면 된다.

image


대신 Project Settings - Quality - Rendering - Soft Particles에 체크해야 한다.

This post is licensed under CC BY 4.0 by the author.