UDN
Search public documentation:

PostProcessMaterialsKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 포스트 프로세스 이펙트 > 포스트 프로세스 머티리얼 이펙트

포스트 프로세스 머티리얼 이펙트


문서 변경내역: Alan Willard 작성. Jeff Wilson 업데이트. 홍성진 번역.

개요


언리얼 엔진 3 내 포스트 프로세싱 시스템의 강력한 기능 중 하나는, 포스트 프로세스 체인 내에서 머티리얼 시스템을 사용할 수 있다는 겁니다. 머티리얼 이펙트 노드를 통해 렌더링된 씬을 샘플링/변경/조작할 수 있는 유연성과 확장성이 그대로 유지되는 겁니다. 여기서는 포스트 프로세스 체인 내에서 머티리얼 이펙트로 사용할 머티리얼 제작시 흔히 사용되는 기술과 기본 원칙을 약간 다뤄 보도록 하겠습니다.

MaterialEffect (머티리얼 이펙트)


머티리얼 이펙트 노드는 포스트 프로세싱 체인에 머티리얼을 끼워넣는 데 사용합니다. 참조하는 머티리얼은, 그 Emissive (방출) 출력이 체인의 다음 노드에 렌더링된 씬으로써 전달되는 것입니다.

Material (머티리얼)

머티리얼 이펙트에서 참조된 머티리얼은 보통 현재 렌더링된 씬을 샘플링한 후에 어떤 식으로든 변경한 결과물을 그 Emissive (방출) 채널을 통해 전달하게 됩니다. 포스트 프로세스에 사용된 머티리얼은 MLM_Unlit 라이팅 모델 을 사용해야 하며, 씬 텍스처나 씬 뎁스(깊이)를 샘플링하기 위해서는 머티리얼이 투명 블렌드 모드 (Translucent, Additive, Modulate, AlphaComposite)를 사용해야 합니다.

Depth Group (뎁스 그룹)

Scene DPG (씬 DPG) 프로퍼티는 머티리얼 이펙트가 어느 버퍼를 샘플링할 지를 가리킵니다. 대부분의 머티리얼 효과는 SDPG_PostProcess 그룹을 사용하나, SceneDepth (씬 뎁스) 표현식을 사용하는 이펙트는 SDPG_World 그룹을 사용할 수도 있습니다.

머티리얼 이펙트 추가하기

포스트 프로세스 에디터 작업공간에 우클릭하여 MaterialEffect (머티리얼 이펙트) 노드를 추가할 수 있습니다. Scene (씬)이나 다른 기존 노드의 출력과 머티리얼 이펙트 노드의 입력을 연결하면, 해당 머티리얼 이펙트가 체인에 추가됩니다.

머티리얼 이펙트 노드를 선택하면 그 프로퍼티가 표시됩니다. 머티리얼 이펙트 노드의 Material (머티리얼) 프로퍼티에 머티리얼을 할당하려면, 먼저 콘텐츠 브라우저에서 머티리얼을 선택합니다. 그리고서 Material (머티리얼) 프로퍼티의 button_useselected.jpg 버튼을 눌러 선택된 머티리얼을 할당할 수 있습니다.

포스트 프로세스 체인과 씬에서 새로 생긴 머티리얼 이펙트의 효과를 보려면, 머티리얼 이펙트가 추가될 포스트 프로세스 체인이 기본 포스트 프로세스로 설정되어 있어야 합니다. DefaultEngine.ini 안의 DefaultPostProcessName (디폴트 포스트 프로세스 이름) 프로퍼티를 통해 설정합니다:

[Engine.Engine]
DefaultPostProcessName=EngineMaterials.DefaultScenePostProcess

[UnrealEd.UnrealEdEngine]
DefaultPostProcessName=EngineMaterials.DefaultScenePostProcess

에디터에서 효과를 미리보려면, 머티리얼 이펙트 노드의 Show In Editor (에디터에서 표시) 프로퍼티를 체크하고, 원근 뷰포트의 포스트 프로세스 이펙트 표시 플랙도 켜 놔야 합니다.

SceneTexture (씬 텍스처) 표현식


포스트 프로세싱 시스템에서 사용할 머티리얼을 제작할 때는, 머티리얼의 일차 렌더링 소스로 TextureSample (텍스처 샘플) 대신 씬 텍스처 표현식이 사용됩니다. 이 표현식은 일반 텍스처가 아닌 현재 렌더링되는 씬을 출력한다는 점만 빼면, 모든 텍스처 샘플과 똑같은 식으로 사용됩니다. 아래는 씬 텍스처 표현식의 출력이 머티리얼에 의해 변경되는 모습을 보이고자, 깊이-기반 채도감소(desaturation) 효과를 더해 시각화시킨 그림입니다:

scenetexture_preview.jpg

가장 기본적인 사용법은 RGB 출력을 셰이더용 Emissive (방출) 입력에 연결하는 겁니다. 만약 이 예를 포스트 프로세스 시스템에서 사용했다면 시각적인 결과는 없을 겁니다. 그저 씬을 렌더링하기만 할 뿐, 그 결과물에 부가 작업을 하지는 않기 때문입니다. SceneTexture (씬 텍스처)에는 UVs 입력이 있으며, 마찬가지로 TextureSample (텍스처 샘플)에 있는 것과 같은 겁니다. 이 UVs 입력을 사용하면 타일링과 UV 오프셋을 변경할 수 있습니다.

주: 머티리얼 에디터에서 SceneTexture (씬 텍스처)는 씬을 제대로 렌더링하지 못하며, 돌아가는 모습을 확인하려면 포스트 프로세스 시스템에서 사용중이어야 합니다.

SceneDepth (씬 뎁스) 표현식


머티리얼 에디터의 씬 뎁스 표현식은 씬 뎁스 텍스처를 샘플링하는데 사용할 수 있습니다. 본질적으로는 현재 픽셀에 있는 월드의 지오메트리와 카메라간의 깊이를 출력하는 표현식입니다. 거리 범위 [0, 5120]을 값 범위 [0,1] (또는 검정에서 하양으)로 매핑시킨 씬 뎁스 표현식의 결과물은 아래 그림과 같습니다:

scenedepth_preview.jpg

대부분의 경우 씬 뎁스 표현식을 사용하면 깊이 결과를 바라는 범위값으로 스케일 및 편향시키기 위해 부가적인 계산이 수행됩니다. 예를 들어 씬 뎁스를 값으로 나누면 (SceneDepth / 1024) 0에서 1024까지의 깊이를 0에서 1까지의 정규화된 거리값으로 나타내 줍니다. 이를 [0,1] 범위로 고정시키면, 깊이가 회색조 값으로 매핑된 위의 예제같은 다양한 효과에 사용할 수 있습니다.

머티리얼 예제


최종 렌더링되는 씬의 변경을 위해 머티리얼 이펙트 채널을 사용하는 방법 몇 가지입니다.

Scene Tinting (씬 착색)

sepiatone_preview.jpg

세피아톤 효과를 내기 위해 씬 색을 다시 입힌 데모 예제입니다.

(크게 보려면 클릭)

먼저 씬 텍스처 표현식을 추가한 다음 씬 색의 불포화를 위해 Desaturation (불포화) 표현식에 통과시켰습니다.

씬 색의 R 채널을 분리하기 위해 ComponentMask (컴포넌트 마스크)를 추가한 다음 상수값 8로 곱해줬습니다.

이 값에다 세피아 '착색'을 나타내는 Constant3Vector (상수 3 벡터)값 (0.4875, 0.2588, 0.0784)을 곱합니다.

그리고서 씬의 다른 (빨강 이외) 엘리먼트를 다시 들여오기 위해 Add (합) 표현식을 사용하여 씬의 불포화된 버전과 결과물을 재결합시킵니다.

그 최종 결과물을 Emissive (방출) 입력 채널에 연결해 줍니다.

Distortion (왜곡)

열이나 물의 왜곡 효과를 내기 위해 씬 텍스처의 UV 텍스처 좌표를 변경하는 데모 예제입니다.

(크게 보려면 클릭)

여기서 돌아가는 기본 원리는, 패닝시킨 텍스처 샘플의 R과 G 채널을 왜곡시키기 위해 ScreenPosition (화면 위치) UV 텍스처 좌표에다 더해준다는 겁니다. 먼저 U와 V 타일링이 2.0, 2.0인 TextureCoordinate (텍스처 좌표) 표현식을 추가합니다. 텍스처 좌표의 출력을 Panner (패너)의 Coordinate (좌표) 입력에 X와 Y 속도값 0.0, 0.375로 하여 연결합니다. (아래와 같은) 무지개 구름 이미지의 텍스처를 갖는 텍스처 샘플의 UV 입력에 패너의 출력을 연결합니다. R G 채널 분리를 위해 텍스처 샘플의 RGB 출력을 컴포넌트 마스크에 통과시킵니다. 왜곡량을 줄이기 위해 컴포넌트 마스크의 출력에 상수값 0.05를 곱합니다.

rainbowcloud.jpg

메인 UV 텍스처 좌표로 사용할 R G 채널을 분리하기 위해, Screen Align (화면 맞춤)을 참으로 설정한 화면 위치 표현식을 컴포넌트 마스크에 통과시킵니다. 뷰포트의 경계를 약간 건네고자 씬의 스트렛치를 위해 컴포넌트 마스크의 출력을 상수값 0.975로 곱해줍니다. 왜곡을 적용했을 때 씬의 엣지가 눈에 띄지 않게 하기 위한 작업입니다.

위의 각 네트워크의 끝에 있는 Multiply (곱) 표현식 둘의 출력을 Add (합) 표현식을 사용해 합칩니다. 결과값을 씬 텍스처 표현식의 UV 입력에 연결합니다. 마지막으로 씬 텍스처의 RGB 출력을 머티리얼의 Emissive (방출) 채널에 연결해 줍니다.

Depth Mask (뎁스 마스크)

보통의 씬 텍스처 출력 & 위에서 만든 왜곡 효과 보간용 마스크로 SceneDepth (씬 뎁스)를 사용하는 데모 예제입니다.

(크게 보려면 클릭)

여기서 참조된 왜곡 네트워크 셋업 방법은, 위의 Distortion (왜곡) 부분을 참고하시기 바랍니다.

씬 뎁스 표현식을 추가한 다음 사용가능한 범위의 값으로 정규화하기 위해 그 출력을 상수값 5120으로 나눠 줬습니다. Divide (나누기) 표현식의 출력을 최소/최대=0.125/1.0인 ConstantClamp (상수제한) 표현식에 통과시킵니다. 제한된 값을 LinearInterpolate (선형보간) 표현식의 Alpha (알파) 입력에 연결합니다.

왜곡 네트워크의 화면 위치 부분에 있는 곱 노드의 출력을 선형 보간 표현식의 A 입력에 연결합니다. 카메라에 가까운 오브젝트를 볼 때 사용할 미변경 UV 텍스처 좌표를 나타냅니다.

왜곡 네트워크에 있는 합 표현식의 출력을 선형 보간 표현식의 B 입력에 연결합니다. 원거리의 오브젝트를 볼 때 사용할 변경되거나 왜곡된 UV 텍스처 좌표를 나타냅니다.

선형 보간 표현식의 출력을 씬 텍스처 표현식의 UV 입력에 연결하고, 그 RGB 출력을 머티리얼의 Emissive (방출) 입력 채널에 연결해 줍니다.