TECHARTNOMAD | TECHARTFLOWIO.COM

UNREAL ENGINE

[번역]Unreal Engine Substrate: Authoring Materials That Matter

jplee 2023. 9. 8. 14:42

언리얼 엔진 서브스트레이트: 중요한 머티리얼 제작

슬라이드 데크에 메모를 추가한 이유는 프레젠테이션을 라이브로 진행할 때 100% 복원되지 않았을 수 있는 많은 세부 사항을 검토해야 했기 때문에 필요하다고 생각했기 때문입니다. 또한 라이브 프레젠테이션을 놓친 모든 분들께도 도움이 될 것입니다.

 

 

UE의 현재 머티리얼 모델은 셰이딩 모델이라는 개념을 기반으로 합니다. 셰이딩 모델은 주어진 외형에 적합한 특정 비주얼 피처 세트를 대상으로 합니다. 예를 들어 일반 유전체/전도체, 클리어코트, 서브서피스 스캐터링, 클로스, ...에 대한 셰이딩 모드가 있습니다.

각 셰이딩 모델은 외형 스펙트럼 중 특정 범위를 대상으로 합니다.

기존 셰이딩 모델의 대부분은 최신 기술/구현을 사용하지만, UE는 게임용 고성능 렌더링을 목표로 하기 때문에 성능은 그대로 유지합니다. 예를 들어 포트나이트는 최대 120Hz로 실행됩니다.

또한 이러한 모든 셰이딩 모델은 래스터화 경로, 루멘과 같은 레이 트레이싱 효과 또는 패스 트레이서 등 렌더링 경로 전반에 걸쳐 시각적으로 일관성을 유지합니다.

 

그러나 이러한 특수 셰이딩 모델이 사일로에서 작동하면(역자 주:아마 발표자는 닫힌 개발환경을 말 하고 싶었던 듯.) 아티스트가 자유롭게 창의력을 발휘할 수 없습니다.

예를 들어 아티스트가 SSS 표면과 메탈릭 표면을 블렌딩하고 싶다고 가정해 봅시다.

셰이딩 모델 접근 방식을 사용하면 픽셀당 하나의 셰이딩 모델만 표현할 수 있기 때문에 블렌딩 시 전환/불연속성이 심하게 나타납니다.

외관을 적절히 블렌딩하면 예상대로 전환이 부드러워집니다.

 

 

또 다른 예로, 아티스트가 플라스틱 갑옷이나 땀으로 코팅된 서브서피스 기반 머티리얼을 만들고자 한다면 어떨까요? 
이 역시 셰이딩 모델 접근 방식을 사용하면 SSS 셰이딩 모델의 일부 기능과 코트 셰이딩 모델의 일부 기능이 동시에 필요하기 때문에 즉시 사용할 수 없습니다.

 

 

또 다른 고급 예시입니다. 아티스트가 고급 천 소재를 제작하고 싶다고 가정해 봅시다. 이 소재는 직조된 패턴을 모방하기 위해 서로 수직인 두 세트의 부드러운 실(즉, 이방성 하이라이트가 있는)로 만들어질 것입니다. 그리고 천은 플라스틱 시트로 덮여 있을 것입니다. 
하지만 이 역시 셰이딩 모델 접근 방식으로는 즉시 구현할 수 없습니다.

 

 

여기 기존 셰이딩 모델의 한계가 구현에 더욱 엄격하게 적용되었습니다.
UE 기본 셰이딩 모델은 금속성 개념을 사용하여 도체와 메탈릭을 구분합니다. 두 유형 사이를 전환할 때 원치 않는 후광이 나타날 수 있습니다. 이는 PBR의 알려진 한계이지만, 서브스트레이트에서 금속성 개념을 없애기 전에는 해결할 수 없었던 문제였습니다.  (역자주: Metalness 워크플로우의 한계 이며 Specular Glossy 워크플로에서는 이 리미테이션은 없음)

 

 

이 모든 예는 아티스트가 특정 유형의 고급 모양을 얻으려면 기존 셰이딩 모델을 수정하거나 완전히 새로운 셰이딩 모델을 만들어야 한다는 사실을 강조합니다.
이러한 경우 매번 새로운 셰이딩 모델을 추가하면 셰이딩 모델의 조합이 폭발적으로 증가하게 됩니다. 
새로운 셰이딩 모델을 추가하면 모든 것이 의도한 대로 작동하도록 구현하고 보장하기 위한 엔지니어링 비용이 증가합니다.
또한 장기적으로는 셰이딩 비용이 전반적으로 증가하게 됩니다. 더 복잡한 셰이딩 모델을 구현할수록 분기 및 레지스터 압력이 증가하여 단순하고 가장 많이 사용되는 셰이딩 모델의 성능도 저하될 가능성이 높습니다.
이러한 성능 저하를 방지하기 위해 프로젝트 설정을 활용하여 이러한 고급 셰이딩 모델을 필요한 프로젝트에서만 활성화할 수 있습니다. 하지만 이 경우 유지보수/테스트 문제가 발생합니다.
게다가 UE는 디퍼드 아키텍처를 기반으로 하므로 저장할 수 있는 입력의 수가 제한됩니다.
이러한 모든 제약으로 인해 고급 머티리얼을 임포트하고 지원하는 것이 어렵게 느껴집니다.

(역자 주 : 실제 이 문장에서 언급 한 문제점이 도출 되는 프로젝트 라면 Strata 를 사용하고 명령어 수 및 셰이더 복잡도 그리고 실제 성능지표 평가를 해 볼만 하다.)

 

 

이때 서브스트레이트가 빛을 발합니다.
서브스트레이트는 아티스트가 조립하여 복잡한 외관을 만들 수 있는 빌딩 브릭(벽돌?)으로 구성된 컴포지션 프레임워크입니다.
하지만 이 프레임워크는 기존 시스템만큼의 성능을 유지해야 하며, 다양한 렌더링 경로(래스터/레이트레이싱 효과/패스트레이싱) 간에 시각적으로 일관성을 유지해야 합니다.

또한 이 프레임워크는 확장 가능해야 합니다. 복잡한 머티리얼을 사용하는 것도 하나의 목표이지만, 동일한 머티리얼의 변형을 하이엔드 하드웨어용부터 저사양 하드웨어용까지 다시 작성하고 싶지는 않습니다.

(역자 주 : 정리 하면 Stackable 하다는 뜻, 역자가 URP 셰이더 코드 전체를 스택 기반으로 리펙토링 하려고 하는 개념도 비슷.)

 

업계에는 많은 재료 표준 및 사양이 존재합니다. MaterialX는 업계에서 가장 많은 추적을 받고 있는 것으로 보입니다.
하지만 이러한 모든 사양에는 복합적인 요구 사항에 맞지 않는 몇 가지 제한 사항이 있습니다.
고정된 토폴로지(Autodesk Std Surface, Adobe Surface, OpenPBR)에 의존하기 때문에 고급 서피스를 구축할 수 없습니다.
또는 많은 스위치와 루프로 인해 효율적인 구현이 까다롭고 단순화 규칙으로 머티리얼 복잡성을 축소하기 어려운 BSDF 수프(역자 주: 여러가지가 한대 섞여있고 분리 하기 힘들다는 것을 수프에 비유)에 의존합니다.

 

이것이 바로 서브스트레이트 개발을 시작한 이유입니다. 앞서 말했듯이 Substrate는 프레임워크입니다. 세 가지 개념을 중심으로 구축되었습니다:

- 물질을 표현하는 방식인 슬래브
- 물질 조각을 조작하는 연산자
- 트리: 물질의 토폴로지, 즉 서로 다른 물질 조각들이 서로 어떻게 배열되어 있는지를 나타냅니다.

(역자 주: 이 세 가지 분류 개념이 가장 중요한 핵심이다. 실제 복잡한 머트리얼 작업 때 Slab 들의 블럭 조합이 되니까)

slab - Wiktionary, the free dictionary

 

slab - Wiktionary, the free dictionary

English[edit] Pronunciation[edit] Etymology 1[edit] From Middle English sclabbe, slabbe, of uncertain origin; possibly from *slap, related to dialectal slappel (“portion, piece”), along with slape (“slippery”), sleip (“smooth piece of timber”),

en.wiktionary.org

 

이를 설명하기 위해 예를 들어 보겠습니다.
다음은 두 가지 유형의 물질로 만들어진 재료입니다.
금속 및 이방성 섬유로 만들어진 베이스 레이어. 이를 슬래브라고 표현합니다.
유전체로 만들어지고 약간의 흡수가 있는 또 다른 층. 이것은 또 다른 슬래브로 표시됩니다.
그리고 두 개의 슬래브는 수직 레이어링 연산자를 사용하여 서로 겹쳐집니다.

 

 

 

이것이 오늘의 의제입니다.
프레임워크의 여러 부분을 설명하겠습니다: 슬래브/오퍼레이터/트리에 대해 설명합니다.
그런 다음 확장성, 스토리지 및 평가에 대해 자세히 살펴보겠습니다.

 

 

슬래브부터 시작하겠습니다.

 

 

 

슬래브물질을 표현하는 프레임워크의 기본 요소입니다. 이는 기존 셰이딩 모델의 대부분을 통합하는 수단입니다.
인터페이스와 특정 두께의 매질로 이루어진 하나의 물질 조각으로 생각하면 됩니다.
모든 프로퍼티는 물리적 속성을 기반으로 하므로 너무 복잡하게 재매개화하지 않고도 물질을 설명하는 데 도움이 됩니다. 특히 적절한 단위를 사용함으로써 일관성을 유지할 수 있습니다. 이러한 속성을 다룰 때 우리가 조작하는 대상과 빛이 어떻게 상호 작용하는지에 대해 공명하거나 생각하는 데 도움이 됩니다. 반대되는 예로 GLTF 또는 기타 사양에서 확산 투과/색 흡수 등은 조작하는 기능만 다를 뿐 전체적으로 의미가 없는 사양을 들 수 있습니다. 

 

 

 

인터페이스는 생각만큼 간단합니다.
두 미디어 간의 분리를 정의하고 마이크로 패싯 필드로 모델링합니다. 화려하지 않고 업계 표준에 부합하는 훌륭하고 단순한 인터페이스입니다!
이 인터페이스는 다양한 속성으로 매개변수화되어 있으며, 그 중 몇 가지를 자세히 살펴보겠습니다.

 

 

 

반사율을 설명하기 위해 F0 매개변수화(즉, 표면의 반사율이 정상 입사)를 사용하는데, 이는 (복잡한) IOR과 달리 정규화되어 있어 편리합니다.

고급 도체를 설명하기 위해 우리는 강도가 아닌 색도에만 영향을 미치고 스치는 핸들에서 에너지를 감소시키지 않는 F90 파라미터화를 사용했습니다. 이 매개변수화는 가장 비물리적인 매개변수화이며, 나중에 Adobe의 F82를 선호하기 위해 이 매개변수화를 다시 검토할 수 있습니다. 이 기능은 옵트인 방식이므로 사용한 경우에만 비용을 지불하게 됩니다.

옵트인 방식(opt-in)
당사자의 동의 하에 개인정보 수집, 활용에 대한 처리가 이루어지는 개인 정보처리 방식를 말한다. 즉, 수신자의 허락을 받은 경우에만 전화나 이메일을 발송하고, 유료 서비스를 제공하는 식이다. 이는 스팸메일(불특정 다수인에게 무작위로 보내지는 메일)을 규제하기 위함이며, 기타 모든 광고성 정보 전송에도 적용된다. 한국은 2005년 3월 31일부터 휴대전화 등 전화와 팩스를 통해 상품, 서비스 등을 소개할 경우 옵트인(opt-in) 제도를 시행키로 했다. 반대말은 옵트아웃(opt-out)으로 정보주체의 동의 없이 개인정보를 이용하고, 거부를 밝혔을 때 그 활동을 중지하는 방식이다.



세부적인 설명을 위해 간단한 GGX NDF를 사용합니다. 이 역시 업계 표준이 훌륭하기 때문에 새로 만들 필요가 없습니다. 
기본적으로 기본 스페큘러 러프니스는 디퓨즈 러프니스와 결합됩니다.
이방성의 경우, 간단하고 잘 작동하는 Kulla & Conty 파라미터화를 사용합니다.
탄젠트 베이시스 표현은 용도에 따라 조정합니다. 표면이 등방성이면 단순 법선을 저장하지만, 표면이 비등방성이면 두 개의 팔면체 인코딩(32비트로 양자화)을 사용하여 전체 탄젠트 기저를 저장합니다. 

참고: 나중에 살펴보겠지만, 머티리얼을 여러 개의 슬래브로 만들 수 있으며, 동일한 탄젠트 기저를 공유할 수 있고 메모리 절약을 위해 한 번만 저장할 수 있습니다. 이에 대한 자세한 내용은 스토리지 섹션을 참조하세요.

 

역자 주.
크리스토퍼 쿨라, 알레한드로 콘티
2년 전, 소니 이미지웍스의 렌더링 및 셰이딩 그룹은 물리 기반 셰이더의 구조를 검토하여 구현을 간소화하고 품질을 개선하며 향후 광원 전송 알고리즘의 개선 사항을 활용할 수 있는 기반을 마련하기 위한 프로젝트에 착수했습니다.
고전적인 마이크로패싯 BRDF 빌딩 블록에서 시작하여 에너지 절약과 아티스트 친화적인 파라미터화를 조사했습니다. 이어서 볼륨 렌더링과 서브서피스 스캐터링 알고리즘을 통합하고 미디어 트래킹을 위한 시스템을 구축하여 중첩된 미디어의 설정을 개선했습니다. 마지막으로, 이러한 모든 빌딩 블록을 기반으로 간소화된 인터페이스와 파라미터 블렌딩을 통한 보다 유연한 레이어링 접근 방식으로 아티스트용 셰이더를 재구축했습니다.

 

 

조금 더 난해하게 설명하자면, 기본 로브와 자유 웨이트가 있는 보조 GGX 로브가 혼합되어 있습니다.

주된 의도는 더 긴 '스페큘러 테일'을 가진 표면을 표현하는 것이었습니다. GGX NDF에는 특정 꼬리가 있지만, 특정 제조된 머티리얼의 경우 스페큘러 로브의 꼬리가 더 길어질 수 있습니다. 두 개의 스페큘러 로브를 혼합하여 날카로운 반사와 흐릿한 베일을 동시에 볼 수 있는 이 흐릿한 외관을 재현할 수 있었습니다. 

또한 Barla 등이 보여준 것처럼 두 로브를 지각적으로 혼합하기 위한 헬퍼 노드를 노출했습니다. 

 

 

 

슬래브는 인터페이스에서 이방성을 나타낼 수 있습니다. 이 비등방성 레이어는 스페큘러 로브와 달리 수평으로 흩어집니다. 
이러한 불투명도는 항상 스페큘러 로브 위에 있으며 완전한 파라미터화(러프니스, 알베도, 커버리지)를 갖습니다. 

 

 

앞서 언급했듯이 마이크로 패싯 필드를 사용하여 인터페이스를 모델링합니다. 이러한 마이크로 패싯은 일정한 크기를 가지므로 표면을 확대하면 마이크로 패싯을 볼 수 있습니다. 이때 '글린트'가 중요한 역할을 합니다.

표면 UV에 파라미터화된 밀도 제어를 통해 글린트를 선택하고 크기를 제어할 수 있습니다. 이를 실시간으로 구현하기 위해 유니티에서는 미리 계산된 LUT를 사용하여 다양한 LOD에서 글린트가 작동하는 방식을 정의하는 체메인(Chermain et al.)의 접근 방식을 사용합니다.

주어진 '글린트' 밀도에 대해 표면에서 줌아웃하면 픽셀 풋프린트가 점점 더 많은 글린트를 포함하게 됩니다. 특정 거리에서는 단일 로브 GGX 로브로 수렴합니다.

이는 주로 자동차 페인트, 눈 또는 반짝이는 효과에 사용됩니다.

 

 

 

앞서 제시한 반사율 파라미터 외에도 슬래브에는 '스페큘러LUT' 에셋을 연결할 수 있습니다. 이 LUT는 뷰 및 조명 각도에 따라 파라미터화된 슬래브의 균일한 '틴팅'을 정의합니다.

이 LUT는 일부 램프 또는 텍스처로 제어할 수 있으며, 뷰 및 조명 각도에 따라 다시 파라미터화됩니다.

슬래브 모델로는 시뮬레이션할 수 없는 오팔레센스나 뷰/라이트 상관관계가 있는 복잡한 자동차 페인트와 같은 고급 사례에 유용합니다.

 

 

인터페이스의 러프니스가 null이 아닌 경우 빛이 산란됩니다. 이로 인해 거친 투과 모양이 생성됩니다. 이 경우 거친 외관은 중간 산란(즉, 표면 아래 투과)이 아닌 인터페이스에 의해 발생합니다.

이를 시뮬레이션하기 위해 인터페이스 반사율에서 IOR을 검색합니다. (사용자는 다른 방법을 사용할 수도 있습니다.)

래스터 경로의 경우 러프니스와 깊이/두께로 파라미터화된 사전 계산된 LUT를 사용하여 '빛 확산'을 계산합니다. 그런 다음 포스트 프로세스 패스에서 그에 따라 블러를 계산합니다.
RT/PT 경로의 경우 광선 교차를 사용하여 간단히 계산할 수 있습니다.

 

 

아직 다루지 않은 한 가지 측면은 슬래브의 여러 부분 사이의 에너지를 관리하는 방법입니다.

입사광선이 인터페이스에 부딪히면 특정 마이크로패싯에 부딪히게 됩니다. 이때 광선은 반사되거나, 투과되거나, 반사되면서 다른 마이크로패싯에 부딪힐 수 있습니다.

후자의 경우 에너지 손실을 방지하기 위해 이러한 여러 번의 '바운스'를 시뮬레이션해야 합니다. 이는 특히 도체의 경우 거칠기 값이 높을 때 매우 두드러집니다. 이러한 에너지 절약을 시뮬레이션하기 위해 터퀸의 접근 방식을 사용합니다.

두 번째로 중요한 측면은 매체에 정확한 양의 에너지를 전달하고 있는지 확인하는 것입니다. 즉, 인터페이스에 반사되지 않고 흡수되지 않은 모든 빛은 매질로 전달되어야 합니다. 이를 위해 Turquin의 접근 방식에서 다시 설명한 대로 미리 계산된 방향성 알베도 표를 사용합니다. 

Turquin - From Ray to Path Tracing - SIGGRAPH 2020 Presentation.pptx (live.com)

 

https://view.officeapps.live.com/op/view.aspx?src=https%3A%2F%2Fwww.advances.realtimerendering.com%2Fs2020%2FTurquin%2520-%2520From%2520Ray%2520to%2520Path%2520Tracing%2520-%2520SIGGRAPH%25202020%2520Presentation.pptx&wdOrigin=BROWSELINK

인터넷 홈에서 파일을 검색하는 동안 잠시 기다려 주세요.

view.officeapps.live.com

 

 

이것으로 인터페이스 부분을 마칩니다. 이제 슬래브의 매체 부분에 대해 알아보겠습니다.

이 매질은 체적 공식을 기반으로 합니다. 그 의도는 확산된 표면에서 완전히 투명한 표면 사이의 연속체를 표현하고 모든 예술적 파라미터화를 추상화할 수 있는 고유한 파라미터화를 갖추는 것이었습니다.

따라서 매체는 다음과 같이 설명됩니다:
평균 자유 경로, 즉 매체의 입자에 부딪히기 전 광자의 자유 이동 거리.
알베도, 즉 다중 산란 후의 전체 매질 반사율.
위상 함수 이방성: 매체의 입자에 부딪힐 때 방향에 따른 산란을 설명합니다.
두께, 즉 매체의 깊이. 평균 자유 경로, 줄여서 MFP, 알베도는 산란 및 흡수 계수의 두 배에 불과합니다.

 

 

이러한 매개변수화를 통해 외관의 모든 스펙트럼을 커버할 수 있습니다.
완전 디퓨즈에서 완전 투명까지.

간단히 말하면 다음과 같이 생각할 수 있습니다:
확산 알베도는 외관의 '유백색'을 제어합니다.
평균 자유 경로는 표면을 통해 볼 수 있는 정도를 제어합니다.

 

 

구현 관점에서 이 공간을 네 부분으로 나눌 수 있습니다:
불투명 확산 부분: 표면을 통해 볼 수 없고 픽셀 풋프린트 너머로 빛 번짐이 없습니다.
광학적으로 두꺼운 부분: 표면을 통해 볼 수는 없지만 픽셀 풋프린트 너머로 약간의 빛 번짐이 있습니다.
광학적으로 얇은 부분: 표면을 통해 볼 수 있지만 여전히 약간의 산란이 발생합니다.
반투명 부분: 광학적으로 얇은 부분의 특수한 경우로, 산란이 발생하지 않습니다.

이러한 각 부분을 어떻게 지원/구현하는지 자세히 살펴보겠습니다.

 

 

디퓨즈 부분에는 Chan을 기반으로 한 역반사 모델을 사용합니다.
이는 러프니스가 1차 스페큘러와 결합된 디퓨즈 마이크로 패싯 모델을 근사화합니다.
러프니스는 역반사, 즉 스치는 각도에서 반사되는 빛의 양을 제어합니다. 이는 러프니스가 높을 때 특히 두드러집니다.
앞의 다이어그램과 같이 이 '체제'는 픽셀 풋프린트가 MFP에 비해 클 때 사용됩니다.

 

 

 

이 '체제'를 MFP에 비해 픽셀 풋프린트가 더 작을 때 사용하면 광학적으로 두꺼운 체제로 들어갑니다.
이를 위해 일반적인 SSS 기법을 사용합니다.
래스터 경로의 경우 포스트 프로세스 방식에 기반한 Xie et al.
RT/PT 경로에는 랜덤 워크 알고리즘을 사용합니다.
이 구현에서는 머티리얼이 여러 개의 슬래브로 구성된 경우 가장 아래쪽에 보이는 슬래브에만 적용된다는 점에 유의하세요.
래스터 경로의 경우 성능상의 이유로 랩 라이팅과 같은 다른 방법을 사용할 수 있습니다.

 

 

 

광학적으로 얇은 경우는 처리하기가 다소 어렵기 때문에 실시간 렌더링에서는 다소 드문 경우입니다. 반투명(속이 훤히 들여다보임)과 대규모 산란(안개 모양)을 동시에 결합합니다.

저희의 경우 광학적으로 얇은 슬래브가 다른 슬래브 위에 쌓이거나 겹쳐진 특수한 경우에 초점을 맞췄습니다. 

이러한 체제에서는 빛이 다시 산란되는 부분과 표면을 통해 투과되는 빛의 두 부분이 있습니다.
투과 부분에서는 흡수를 위해 간단한 비어 램버트 모델을 사용합니다.
산란의 경우 단일 산란 알베도(확산 알베도에서 추정), 재조정된 MFP(1m 두께 슬래브에 맞게 재조정), 뷰 및 조명 각도로 파라미터화된 미리 계산된 LUT를 사용합니다. 이 LUT는 다양한 MFP/알베도/시야/조명 조건에서 매체에 의해 다시 산란된 휘도를 계산하여 오프라인으로 계산했습니다. 
이 접근 방식은 첫 번째 순간, 즉 에너지의 양만 해결할 뿐 표면의 흐릿한 느낌을 유발하는 '확산'은 처리하지 못합니다. 이는 향후 작업을 위해 남겨두었습니다.

 

 

마지막으로 광학적으로 얇은 표면의 특수한 경우로, '투과'는 가능하지만 산란이 없는 경우입니다.

이 경우 비어-램버트 접근 방식으로 간단히 처리합니다. 
래스터 경로의 경우 전송 부분을 적절히 처리하기 위해 듀얼 소스 블렌딩을 사용합니다. 다시 말하지만, 업계 표준에 따른 것입니다.

여기서 중요한 부분은 전송의 개념과 커버리지의 개념을 분리했다는 점입니다. 이로써 복잡한 '불투명도'라는 용어가 두 가지 명확한 개념으로 분리되었습니다. 이에 대해서는 나중에 자세히 설명하겠습니다.

 

 

지금까지 살펴본 바와 같이, 표면을 보는 스케일에 따라 어떤 체제를 사용해야 하는지가 결정됩니다. 멀리서 볼 때 특정 MFP 값을 가진 표면은 디퓨즈로 렌더링되는 반면, 가까이서 볼 때 같은 표면은 약간의 표면 아래 산란이 있는 광학적으로 두꺼운 것으로 렌더링됩니다. 

저는 단위가 중요하다는 점을 강조하고 싶습니다. 픽셀 풋프린트와 MFP가 적절한 월드 단위를 표현하면 표면을 렌더링하는 방법을 파악하는 데 도움이 됩니다.

 

 

마지막으로 매체의 두께를 고려해야 합니다. 이는 '빛 감쇠'에 영향을 미치는 매체를 통과할 때 빛의 경로가 이동하는 거리를 정의합니다.

단일 레이어 또는 가장 아래쪽 레이어(여러 레이어가 있는 경우)가 있는 경우: 두 가지 경우를 고려해야 합니다.
표면이 '두꺼운'것으로 간주되는 경우 두께는 지오메트리의 경계에 의해 정의됩니다. 래스터 경로의 경우 상수 값, SDF 또는 섀도 맵을 사용하여 두께를 추정할 수 있습니다. RT/PT의 경우 광선의 교차점까지의 거리로 두께를 추정할 수 있습니다.
표면이 얇은 경우, 즉 지오메트리가 평평한 표면(예: 나뭇잎, 천 등)인 경우 두께를 어떤 식으로든 정의해야 합니다. 이러한 경우 루트 노드에 표면 두께를 입력하여 머티리얼 수준에서 두께를 정의합니다.

다른 레이어의 경우 그래프를 통해 두께를 정의합니다. 이는 슬래브가 다른 슬래브 위에 '코팅'/'레이어링'되는 경우에만 필요합니다. 이 경우 상단 슬래브의 두께는 수직 연산자에 의해 제공됩니다.

 

 

 

이것으로 슬래브 섹션을 마칩니다. 이제 문제를 조작하는 연산자에 대해 빠르게 살펴보겠습니다.

 

 

주로 3가지 오퍼레이터가 있습니다.
수평 믹싱 - 두 머티리얼 간의 러핑/블렌딩이라고 생각하시면 됩니다.
수직 레이어링 - 두 머티리얼 사이에 코팅/레이어링을 하는 것으로 생각하면 됩니다.
커버리지 가중치 - 알파 블렌딩으로 생각할 수 있으며, 머티리얼을 더 '투명하게' 만들기 위한 것입니다.

 

 

하지만 먼저 우리가 같은 것에 대해 이야기하고 있는지 확인하기 위해 용어를 올바르게 정의해 보겠습니다.

바닥에 거친 금속 구가 있다고 가정해 봅시다. 빛이 표면에 닿으면 이 거친 금속에서 직접 반사됩니다.

이제 이 구를 녹색 유전체 물질로 코팅한다고 가정해 봅시다. 
왼쪽의 가장 두꺼운 부분은 재료의 두께가 너무 두꺼워서 빛이 표면에 닿을 때 유전체 층에서만 반사됩니다. 투과된 빛은 모두 유전체 층에 흡수됩니다. 이러한 경우 유전체 층의 투과율은 0입니다.

유전체 재료의 두께를 줄이면 투과된 빛은 부분적으로만 흡수됩니다. 따라서 빛은 그 아래의 거친 금속에 도달할 수 있습니다. 이 경우 유전체 층의 투과율은 >0이 되기 시작합니다.

두께를 더 줄이면 흡수되는 빛의 양이 줄어들어 투과율이 더 높아집니다.

처음 세 가지 경우에는 유전체 층이 항상 존재하므로 카메라에서 표면으로 빛이 이동하면 유전체 층에 100% 닿게 됩니다. 유전체 층의 커버리지는 1입니다.
반면에 마지막 경우에는 유전체 층이 전혀 존재하지 않았습니다. 유전체 층의 커버리지는 0입니다.

외삽을 통해 커버리지가 0.5라는 것은 '유전체 층과 거친 금속 표면'에 부딪혔을 때 50%의 변화가 있고, 거친 금속 표면에만 부딪혔을 때 50%의 변화가 있다는 것을 의미합니다.

따라서 커버리지는 슬래브가 존재할 확률을 정의하고 투과율은 슬래브의 1-감쇠를 정의합니다.

슬래브의 커버리지와 투과율을 합쳐서 처리량을 정의합니다.

이제 연산자에 대해 자세히 알아보겠습니다.

 

 

 

수평 믹스 오퍼레이터는 재료를 혼합합니다.

금 소재가 있는데 이를 SSS 소재와 '수평 혼합'한다고 가정해 보겠습니다. 이는 두 소재를 모두 평가하고 그 평가를 혼합한다는 의미입니다. 믹스 계수는 슬래브의 커버리지를 정의합니다. 첫 번째 슬래브의 커버리지는 '믹스', 두 번째 슬래브의 커버리지는 '1-믹스'가 됩니다.

 

 

 

수직 레이어링 연산자를 사용하면 슬래브를 다른 슬래브 위에 쌓을 수 있습니다.

아니소 섬유 소재가 있다고 가정해 봅시다. 유전체 재료로 코팅하고 싶습니다. 이렇게 하면 유전체 재료의 투과율이 이방성 재료의 외관에 영향을 미쳐 붉은 색조를 띠게 됩니다. 레이어 작업을 결합할 수 있습니다. 예를 들어 다른 먼지 층을 그 위에 쌓아 올리면 아래쪽 층의 투과율과 처리량에 다시 영향을 미칩니다.

 

 

 

마지막으로 커버리지 가중치 연산자입니다.
먼저 약간의 흡수가 있는 유전체부터 시작합니다. 표면을 통과하는 빛이 부분적으로 흡수되어 노란색 투과율을 나타냅니다.

 

 

 

커버리지 연산자로 이러한 표면에 가중치를 부여하면 슬래브의 커버리지, 즉 주어진 픽셀에 대한 '존재감'의 양에 영향을 줄 수 있습니다.
커버리지가 1이면 표면이 완전히 표시됩니다.
커버리지가 0이면 표면이 보이지 않습니다.
커버리지가 그 중간인 경우 해당 표면의 일부가 표시됩니다.

 

 

 

다양한 두께와 다양한 적용 범위를 명확하게 구분하는 것이 중요합니다.
다시 주황색 유전체로 코팅된 금속 표면이 있다고 가정해 봅시다.
수직 레이어링 연산자를 사용하면 상단 레이어의 두께를 변경하면 상단 슬래브의 투과율과 처리량 모두에 영향을 주지만 항상 반사 반사를 볼 수 있습니다.
커버리지 가중치 연산자에서는 상단 레이어의 커버리지를 변경할 때 상단 슬래브 투과율은 동일하게 유지되고 (커버리지에 따라) 처리량만 달라집니다. 하지만 커버리지가 0에 도달하면 더 이상 스페큘러 반사를 볼 수 없습니다.

 

 

 

보시다시피 연산자를 사용하여 조립된 물질 슬래브를 사용하여 재료를 만들 수 있습니다. 하지만 최종적으로 조명을 평가하기 위해 이러한 데이터를 어떻게 구성할 수 있을까요?

 

 

 

먼저 클리어 코팅으로 덮인 노란색의 거친 금속 조각에 파란색 스페큘러를 렌더링하고 싶다고 가정해 보겠습니다.
서브스트레이트 측면에서 보면 이는 거친 금속에 대한 슬래브 B와 이를 덮는 슬래브 A로 표현되며, 수직 레이어링 연산자를 사용하여 얻을 수 있습니다.
하지만 이 두 슬래브를 직접 평가하여 두 개의 조명 기여도를 더할 수는 없습니다. 예를 들어 매체 투과율 또는 프레넬 효과를 고려한 처리량과 관련하여 슬래브 A가 슬래브 B에 미치는 영향을 먼저 평가해야 하기 때문에 이는 잘못된 방법입니다.

이러한 효과를 설명하기 위해 오퍼레이터는 노드, 슬래브는 잎으로 표현하는 트리를 사용하여 머티리얼 토폴로지를 표현합니다.

클로저를 출력하기 위해 이 트리를 처리/워킹/평가할 것입니다. 클로저는 조명 평가를 위해 렌더러로 전송할 수 있는 파라미터 백을 나타내며, 시각적 결과에 대한 모든 다른 연산자 효과를 설명합니다.
이 경우 슬래브 A가 머티리얼 토폴로지의 맨 위에 있으므로 라이팅을 그대로 평가할 수 있습니다. 반면 슬래브 B는 계층 구조의 맨 아래에 있으므로 슬래브 B를 평가하려면 슬래브 A를 통과하는 광원 경로, 예를 들어 처리량과 인지된 러프니스에 미치는 영향을 고려해야 합니다.

평가가 완료되면 슬래브는 클로저를 출력합니다. 이러한 각 클로저는 순서와 상관없이 또는 병렬로 평가할 수 있습니다. 각 클로저 평가는 휘도 색상을 출력하며, 이 모든 색상을 합산하여 최종 이미지를 형성할 수 있습니다.


 

 

좀 더 복잡한 예를 살펴봅시다.

여기에는 거친 금속과 수평으로 혼합된 탄소 섬유가 있습니다. 두 슬래브 사이에 전이 영역이 있는 것을 볼 수 있습니다. 이것이 바로 수평 혼합 연산자를 사용하여 두 슬래브를 서로 연결한 이유입니다.
그 위에 수직 레이어링 연산자를 사용하여 다른 두 슬래브 위에 레이어링된 컬러 클리어 코팅을 볼 수 있습니다.

 

 

 

이 트리에서 많은 폐쇄 수량을 평가하여 각 오퍼레이터와 슬래브가 서로에게 미치는 영향을 평가할 수 있습니다.
예를 들어 수평 믹싱 가중치, 최상층 처리량 또는 커버리지 가중치의 영향을 받는 ToViewThroughput.
주어진 슬래브 위의 모든 표면의 투과율을 나타내는 TopTransmittance는 라이팅을 평가할 때 재사용할 수 있으며, 간단한 공식을 사용하여 실제 광원 방향에 리매핑할 수 있습니다.
또한 거친 굴절 효과에 사용되는 거칠기 및 두께 데이터도 출력합니다(나중에 자세히 설명).

 

 

 

그렇다면 트리를 어떻게 처리하고 걸어야 할까요? 이 슬라이드에서 간단하게 설명하기 위해 조명 평가를 위해 클로저에서 사용할 슬래브의 커버리지와 투과율을 업데이트하는 방법만 살펴보겠습니다.

먼저 각 슬래브의 커버리지와 투과율을 평가합니다. 하단의 두 슬래브는 모두 불투명하므로 커버리지가 1이고 투과율이 0임을 알 수 있습니다.
컬러 코트 슬래브는 커버리지가 1이고 표면의 법선을 따라 소재를 분리하여 볼 때 평균 자유 경로에 따른 투과율 매핑이 나타납니다.

 

 

둘째, 슬래브에서 정보를 수집하기 위해 먼저 각 연산자를 더 심층적으로 처리할 것입니다.
따라서 여기서 수평 연산자는 자식들로부터 대표적인 커버리지/투과율을 수집합니다. 그리고 이 경우 두 개의 불투명한 슬래브가 불투명한 표면을 만듭니다.

 

 

 

그런 다음 수직 연산자는 트리 루트로, 자식들로부터 대표적인 커버리지/투과율을 수집합니다. 
이 경우 불투명한 머티리얼 위에 투명 코팅을 레이어링해도 표면은 여전히 불투명합니다.

서브스트레이트 트리의 루트 노드에 있는 커버리지/투과율 값은 사용자가 반투명 렌더링 모드를 선택한 경우 처리량을 계산하는 데 사용할 수 있는 머티리얼 총 커버리지와 총 투과율을 나타내는 것으로, 표면을 씬 컬러와 알파 블렌딩할 때 자체적으로 사용됩니다.

또한 나중에 일부 값을 계산하는 데 사용되는 격리된 최상위 레이어 커버리지/투과율에 대한 별도의 표현도 저장합니다.

 

 

세 번째로, 몇 슬라이드 뒤에서 설명한 대로 ToViewThrouput 또는 TopTransmittance와 같은 다른 값을 계산하기 위해 각 슬래브가 트리를 루트 노드까지 걸어가도록 합니다.

컬러 코트가 수직 연산자의 위쪽을 통과하는 것을 볼 수 있습니다. 따라서 ToViewThrouput 및 TopTransmittance는 변경되지 않습니다.

 

 

 

탄소 섬유 슬래브는 먼저 수평 믹싱 작업자를 통과해야 합니다.
따라서 토뷰트루풋은 그것이 들어오는 쪽에 따라 혼합 무게의 영향을 받습니다.

 

 

 

그런 다음 탄소 섬유 슬래브가 수직 레이어링 노드를 통해 걸어 올라갑니다. 이 노드는 노드의 아래쪽에서 나오므로 수직 노드의 TopCoverage 및 TopTransmittance의 영향을 받는 ToViewThrouput 또는 TopTransmittance를 갖습니다.

 

 

 

 

그리고 이것은 각 슬래브에 대해 하나씩 계속됩니다.

 

 

 

또한 다음과 같은 기판 트리를 처리하는 동안 더 많은 데이터를 계산합니다:
레이어 슬래브 간의 에너지 보존제 전달
거칠기 추적을 사용하여 거친 상단 레이어가 거칠기를 인식하는 하단 레이어에 미칠 수 있는 지각 효과를 설명합니다. 예를 들어, 상단 레이어가 거칠면 상단 레이어 인터페이스에서 들어오는 광선이 더 많이 굴절되기 때문에 하단 레이어 슬래브가 더 거칠게 보일 수 있습니다.
또한 뷰 경로의 굴절도 상단 레이어 러프니스의 함수로 고려합니다. 하단 레이어는 상단 레이어 러프니스와 두께에 따라 흐리게 처리됩니다. 스페큘러 로브의 포인트 스프레드 함수는 하드코딩된 공기 대 물 굴절을 사용하는 가우시안 블러를 사용하여 근사화됩니다. 이를 위해 기본적으로 하단 레이어와 상단 레이어를 서로 다른 버퍼로 분리합니다. 굴절된 스페큘러 로브에 따라 하단 레이어를 흐리게 처리합니다. 그런 다음 두 버퍼를 함께 재구성합니다.

 

 

 

 

좀 더 자세히 설명하자면 머티리얼 토폴로지를 컴파일할 때 최악의 토폴로지에 대해 컴파일을 수행합니다. 이는 트리 파싱 코드를 평탄화해야 하기 때문에 필요합니다. 컴파일러는 안타깝게도 for 루프를 사용한 동적 트리 처리를 처리할 수 없습니다(컴파일 시 이상한 동작과 충돌이 발생할 수 있음).

또한 모든 탄젠트 베이스를 수집하고 일부 슬래브가 동일한 베이스를 사용하는 경우 GBuffer에 할당된 메모리를 제한하기 위해 단일 복사본만 저장합니다.

파란색에서 볼 수 있듯이 각 슬래브에 대해 활성화된 각 기능을 추적하여 GBuffer에 저장된 머티리얼의 최악의 경우 복잡성과 픽셀당 바이트 요구 사항을 자세히 파악합니다. 이는 나중에 설명할 픽셀당 최대 GBuffer 바이트를 구동하는 프로젝트 설정에 따라 단순화할 수 있도록 하기 위함입니다.

 

 

 

 

지금까지 오퍼레이터와 슬래브로 구성된 서브스트레이트 트리의 처리에서 클로저를 출력할 수 있음을 살펴보았습니다.
하지만 프로젝트 품질 설정에 따라 이 클로저 수를 어떻게 제어할 수 있을까요?

 

 

 

먼저, 폐쇄 조합 폭발에 맞서 싸워야 합니다.

이 예시에서 파란색의 슬래브 3은 각각 다른 커버리지를 가진 두 개의 레이어로 구성된 슬래브의 복잡한 토폴로지를 가진 커버리지로 이를 설명합니다.
이 머티리얼 토폴로지를 정의에 충실하게 표현하려면 빛이 이 머티리얼 내에서 이동할 수 있는 다양한 경로를 고려해야 합니다.
예를 들어 빛은 S0을 통과한 다음 S2를 통과한 다음 S3에 도달할 수 있습니다. 또는 S0을 통과한 다음 공기를 통과한 다음 S3에 도달할 수도 있습니다. 이렇게 6개의 서로 다른 경로로 인해 슬래브 3의 처리량과 인지된 러프니스가 달라집니다.
이렇게 하면 효과적으로 6개의 서로 다른 클로저를 평가해야 합니다(서로 다른 ToViewThroughput, TopTransmittance 및 스페큘러 러프니스). 이는 너무 비쌉니다.

이 경우를 단순화하기 위해 유니티는 슬래브를 연결하는 연산자에 따라 슬래브의 조합을 통계적으로 표현하는 방법을 고안했습니다. 이 경우 슬래브 3은 다른 모든 슬래브의 속성을 집계하는 단일 가상 슬래브로 계층화됩니다. 그러면 단일 클로저가 생성됩니다.

 

 

 

우리가 생각해낸 이 통계적 표현에서 슬래브 또는 여러 슬래브의 집합체는 투과율, 커버리지, 거칠기 및 굴절 로브와 같은 고정된 속성 집합으로 표현됩니다.
각 슬래브의 물질 커버리지 간에는 상관관계가 없다고 가정합니다.

예를 들어, 커버리지 연산자가 슬래브에 미치는 영향은 무엇일까요? 기본적으로 물질 투과율, 거칠기 및 굴절 로브에 영향을 주지 않고 슬래브의 커버리지를 감소시킵니다.
또한 수평 혼합 및 수직 레이어링 연산자를 위한 더 복잡한 솔루션도 있습니다. 자세한 내용은 보너스 슬라이드를 참조하세요.

 

 

 

이제 폐쇄 횟수를 제어할 수 있게 되었으므로 대상 플랫폼과 품질 설정에 따라 확장해야 합니다.

예를 들어 다음과 같이 조정할 수 있습니다.
셰이딩 품질, 
활성화된 기능(러프니스 트래킹 또는 러프 리프랙션) 
그리고 디퍼드 셰이딩의 경우 머티리얼을 GBuffer에 맞출 수 있어야 합니다. 이는 픽셀당 바이트 수 제약 조건 세트로 표현됩니다. 포워드 셰이딩을 사용하는 경우에도 모바일에서 실행되는 프로젝트에서는 픽셀당 클로저를 하나 이상 평가하고 싶지 않을 수 있습니다.

 

 

 

 

그렇다면 수평으로 혼합되고 수직으로 겹쳐진 슬래브가 있는 이 복잡한 머티리얼의 예시에서는 어떻게 하면 트리를 단순화하여 출력하는 클로저의 양을 줄일 수 있을까요?

슬래브는 물질의 원칙적인 표현이라는 점을 기억해야 합니다. 따라서 우리는 그 구성 요소를 이해하고 여러 개의 슬래브를 결합하는 방법을 생각할 수 있습니다.
따라서 단순화 문제에 대한 해결책은 몇 가지 경험적 규칙에 따라 슬래브 설명의 매개변수 조합을 사용하는 프로그레시브 트리 단순화입니다. 이것으로 충분하지 않다면 특수 기능을 비활성화하여 단순화할 수도 있습니다.

한 가지 중요한 점은 MDL이나 MaterialX에서 제안하는 BSDF soup에서는 이 작업을 수행할 수 없다는 점입니다. 예를 들어 스페큘러 BSDF와 디퓨즈BSDF는 결합할 수 없기 때문입니다.

 

 

 

다음은 간단한 예입니다:
다음은 일부 디퓨즈, F0, F90 및 노멀이 있는 슬래브 A입니다.
그리고 다른 디퓨즈, F0, F90, 노멀을 가진 또 다른 슬래브 B가 있습니다.
수평 혼합을 파라미터 블렌딩하는 방법은 파라미터의 간단한 러프라고 생각하면 비교적 간단합니다.

 

 

 

모든 로브, 3개의 클로저가 72바이트로 저장된 기본 머티리얼입니다.

 

 

먼저 수평 믹스 연산자에 대한 파라미터 블렌딩을 사용하여 이 머티리얼을 단순화할 수 있습니다(트리에서 가장 깊은 하위 트리를 마진으로 시작하기 때문에).
이 경우 슬래브가 2개이므로 48바이트로 저장되는 클로저가 2개가 됩니다.

 

 

마지막으로 수직 레이어링 연산자에 파라미터 블렌딩을 사용하여 이 머티리얼을 단순화할 수 있습니다(트리에서 가장 깊은 하위 트리에 여백을 두고 시작하기 때문입니다).
이 경우 슬래브가 1개가 되어 12바이트로 저장되는 클로저가 1개가 됩니다.

 

 

 

이제 타깃 플랫폼에 대한 제약 조건을 준수하는 클로저를 출력할 수 있습니다. 이제 씬을 조명하기 위해 어떻게 사용할 수 있는지 살펴보겠습니다.

 

 

 

따라서 실제로 사용한 만큼만 메모리와 조명 비용을 지불해야 한다는 철학이 있습니다.
픽셀당 스토리지와 메모리 공간을 조정할 수 있으므로 화면에 표시되는 내용에 따라 비용이 조정됩니다. 대부분의 머티리얼이 단순하다면 비용도 저렴하게 유지됩니다. 그러면서도 일부 씬에서는 영웅 머티리얼을 더 고급화할 수 있습니다.

이미 알고 계시겠지만 언리얼 엔진에는 다양한 라이팅 경로가 있습니다: 
디퍼드 - 지버퍼에 저장된 클로저를 먼저 읽은 다음 라이팅 패스를 통해 나중에 읽습니다.
포워드: 베이스 패스 중에 라이팅을 일렬로 평가합니다.
루멘 레이 트레이싱: 머티리얼이 레이 트레이싱 페이로드 내부에 저장됩니다.
그리고 이와 유사한 패스 트레이싱.


 

자료의 수명 동안 어떤 일이 일어나는지 살펴봅시다:
머티리얼이 컴파일됩니다. 컴파일러가 일부 슬래브의 가중치가 항상 0인 것을 식별하면 코드가 평탄화된 후 정적 컴파일 분석에 의해 해당 슬래브가 컬링됩니다.
베이스 패스 머티리얼 셰이더가 실행될 때
클로저가 평가되어 gbuffer에 기록됩니다. 
클로저의 가중치가 0인 경우, 클로저는 건너뛰고 gbuffer에 기록된 목록에서 제거됩니다.
나중에 조명 패스가 평가를 위해 클로저를 읽습니다.

 

 

 

gbuffer가 어떻게 사용되는지 좀 더 자세히 살펴보겠습니다:
가능한 한 최소한의 바이트만 사용하기 위해 적극적인 패킹을 통해 재질 클로저가 gbuffer에 저장됩니다.
각 픽셀의 복잡도를 읽기 위해 gbuffer의 첫 번째 비트를 읽고 필요한 셰이딩 복잡도(단순 슬래브, 슬래브 + 피처, 다중 슬래브 등)에 따라 화면을 타일로 분류합니다.
각 조명 패스는 타일링되어 셰이더 코드가 조명을 위한 클로저를 효율적으로 읽고 처리할 수 있도록 최적화할 수 있습니다. 이는 기본적으로 레지스터 압력을 줄이고 점유율을 높이며 GPU의 렌더링 비용을 절감합니다.

 

 

이전 슬라이드에서 설명한 것처럼 실시간으로 발생하는 동적 폐쇄 컬링을 보여주는 작은 그림입니다.

여기에서는 두 개의 슬래브가 수평으로 혼합된 것을 볼 수 있습니다. 오른쪽의 타일 분류 디버그 뷰에서 머티리얼이 실제로 픽셀당 2개의 클로저를 출력하는 복잡한 타일의 비용만 지불하는 것을 볼 수 있습니다. 혼합 가중치가 0인 클로저는 평가 통과에서 간단히 제거됩니다.

 

 

 

그렇다면 GBuffer/머티리얼 버퍼에 픽셀당 무엇을 저장할까요?

분류를 위한 머티리얼의 복잡도를 나타내며 클로저 수, 탄젠트 베이스 수 등을 포함하는 헤더입니다.
그런 다음 활성화된 기능(예: SSS 또는 퍼즈)에 따라 각 클로저에 대한 관련 데이터와 함께 클로저 목록이 있습니다.
그런 다음 모든 클로저가 사용하는 탄젠트 베이스 목록이 있습니다. 두 개의 클로저가 동일한 기저를 공유하는 경우 단일 기저가 기록됩니다.
마지막으로, 모든 머티리얼 데이터를 읽지 않고도 SSR, SSAO, DFAO 또는 SSS와 같은 포스트 프로세스와 통신할 수 있도록 탑레이어 데이터(예: 노멀, 러프니스) 및 SSS 데이터와 같은 다른 데이터도 저장합니다.

이 데이터 목록은 복잡성에 따라 조정되며 케이스마다 다른 패킹을 제공합니다.

 

 

 

예를 들어, 디퓨즈, 스페큘러 및 러프니스에만 의존하는 단순한 머티리얼입니다. 단 12바이트의 데이터

 

 

 

이것은 단일 재료입니다: 모든 기능이 있는 슬래브입니다. 이 경우 흐릿함이 사용됩니다. 사용되는 픽셀당 바이트 수는 픽셀당 최대 20바이트까지 올라갑니다.

 

 

 

오팔은 복잡한 머티리얼로, 여러 개의 슬래브가 특징입니다. 

최신 GDC 데모에서 오팔 머티리얼의 특징을 알아보실 수 있습니다:  일렉트릭 드림입니다. 이 머티리얼은 클리어 코팅으로 레이어드된 컬러 스페큘러가 있는 두 개의 레이마치 높이 필드 슬래브로 구성됩니다.

이는 머티리얼의 일반적인 표현을 클로저로 사용하여 저장됩니다. 픽셀당 76바이트의 데이터를 사용합니다.

 

 

 

글린트 또는 스페큘러룻과 같은 고급 시각 효과가 특징인 스페셜 머티리얼입니다.
예를 들어 메조스코픽 패싯 글린트 효과나 트리플 레이어 페인트의 고급 펄 효과를 통해 사실적인 자동차 페인트를 정확하게 렌더링하는 데 사용할 수 있습니다.

 

 

각 클로저에 대해 파라미터는 양자화를 사용하여 공격적으로 패킹됩니다. 그리고 밴딩 아티팩트를 피하기 위해 디더링을 사용합니다.
결국 모든 클로저는 GBuffer에 기록되는 UINT 스트림을 형성합니다.

GBuffer는 UINT의 2D 텍스처 배열입니다(저희는 이를 머티리얼 버퍼라고 부르고 싶습니다).
일부 하드웨어에서는 병합 출력의 캐싱 메커니즘을 활용하는 것이 더 빠르기 때문에 베이스 패스 중에 처음 3개의 레이어는 렌더 타깃 출력에 매핑됩니다.
나머지 레이어는 단일 UAV에 매핑되며 RT 수를 초과하는 모든 UINT는 단순히 이 레이어를 통해 기록됩니다.
저사양 플랫폼에서는 모든 레거시 자료를 최대 3 UINT로 패킹하여 더 비싼 UAV 쓰기를 피하는 것이 목표입니다.

버퍼의 할당 전략에 관해서는 화면에 표시되는 머티리얼에 따라 슬라이스 수를 늘릴 수 있도록 허용합니다. 하지만 메모리 재할당 장애와 조각화를 피하기 위해 다시 축소하지 않습니다.

 

 

 

클로저가 패킹되어 GBuffer에 저장되면 조명 평가를 위해 다시 읽을 수 있습니다.

모든 클로저를 반복해서 로드하기만 하면 됩니다. 이 클로저 각각에 대해 활성화 기능에 따라 조명을 평가할 수 있습니다.

그리고 앞서 언급했듯이 타일 복잡도 분류는 각 패스의 GPU 비용을 최적화하는 데 도움이 됩니다.

 

 

 

하드웨어 레이 트레이싱의 경우, 아시다시피 히트 셰이더의 머티리얼 데이터를 RGS(레이 생성 셰이더)로 전송해야 합니다. 이 작업은 레이 트레이싱 페이로드 구조를 통해 이루어집니다. 그리고 이 구조는 효율을 높이기 위해 작게 유지되어야 합니다. 저희는 64바이트로 제한합니다.

하지만 여러 개의 슬래브가 있는 경우 처리할 전체 서브스트레이트 트리 머티리얼을 RGS로 전송할 수 없습니다. 마찬가지로 여러 개의 클로저도 많은 경우에 적합하지 않습니다.

루멘의 경우, 모든 로브와 리플렉션 디테일이 전역 조명에 덜 중요한 경우, 서브스트레이트 트리를 단일 슬래브로 완전히 단순화하여 단일 클로저를 출력합니다. 따라서 단일 클로저는 페이로드에 적합하고 RGS에서 루멘별로 평가할 수 있습니다.

그러나 경로 추적기의 경우 모든 반사 세부 사항과 상호 작용에 관심이 있습니다. 이 경우 히트 셰이더의 기판 트리 처리 결과 목록에 대한 클로저를 방향성 알베도에 따라 확률적으로 선택하기만 하면 됩니다. 그런 다음 모든 클로저 방향 알베도에 따라 해당 클로저 PDF에 가중치를 다시 부여합니다. 그런 다음 패스 트레이서는 해당 클로저의 로브를 선택하고 샘플링하는 작업을 계속할 수 있습니다.
이는 더 나은 성능을 위해 분산 증가를 감수하는 선택입니다. 샘플과 노이즈 제거기를 조금 더 추가하면 테스트한 사용 사례에서 노이즈가 없는 결과를 얻을 수 있습니다. 이미지에서 볼 수 있듯이.

 

 

 

여기서는 전체 화면 머티리얼과 라이팅을 위해 PS5 @1080p에서 GBuffer 레이다운 및 라이트 패스에 대한 디퍼드 셰이딩 퍼포먼스를 제공합니다.

다음을 확인할 수 있습니다. 
단순 케이스의 경우 동등한 수준입니다, 
단일 사례의 경우 탑레이어 및 SSS 데이터 버퍼를 통해 포스트 프로세스 패스와 통신하기 위해 작성해야 하는 추가 버퍼와 관련된 약간의 오버헤드가 있습니다. 이 부분은 앞으로 개선하고자 하는 부분입니다.
레거시 GBuffer가 지원하지 않는 복잡한 경우에는 예상대로 폐쇄 횟수에 따라 비용이 선형적으로 증가합니다.

 

 

 

메모리 할당과 관련해서는 여기에서 레거시 g버퍼 메모리 사용량을 확인할 수 있습니다.

서브스트레이트가 활성화되면 더 많은 메모리를 할당합니다. 이 오버헤드는 탑레이어 및 SSS 데이터 버퍼를 통해 포스트 프로세스 패스와 통신하기 위해 추가로 작성해야 하는 버퍼와 관련이 있습니다. 이 부분은 앞으로 개선하고자 하는 부분입니다.

 

 

그러나 더 많은 메모리를 할당하더라도 모든 메모리를 쓰는 것은 아니라는 점을 기억하는 것이 매우 중요합니다. 픽셀당 머티리얼의 복잡도에 따라 메모리 사용량을 조정합니다.
또한 향후 비용을 정확하게 유지하고자 하는 일부 레거시 셰이딩 모델에 대해 특별히 최적화된 경로도 있습니다.

메모리 및 성능 최적화는 아직 끝나지 않았으며 앞으로 계속 작업할 예정입니다.

 

 

결론적으로 언리얼 엔진 서브스트레이트는 영웅부터 단순한 머티리얼까지 머티리얼의 성능과 비용을 확장할 수 있는 최신 머티리얼 프레임워크라고 생각합니다. 언리얼이 지원해야 하는 다양한 플랫폼에 적용할 수 있는 확장성 시스템과 함께 말이죠.
에픽은 향후 머티리얼의 시각적 복잡성을 확장하는 데 있어 매우 중요하다고 생각하는 확장 가능한 GBuffer에 대한 솔루션입니다.
또한 단순한 머티리얼의 비용에 영향을 주지 않으면서도 글린트나 스페큘러 러트 같은 고급 사용 사례도 포함할 수 있습니다.
이 시스템은 아티스트의 창의력을 발휘하여 이전에 사용하던 고정된 셰이딩 모델 목록에서 벗어나게 해줍니다. 컴포저블 머티리얼 프레임워크의 문을 열었습니다.

서브스트레이트는 대부분의 시스템과 플랫폼에서 지원되며 확장성 제어 기능을 제공합니다. 이를 필요로 하는 플랫폼에서 중요한 성능을 유지하면서 새로 고침 빈도나 품질을 우선적으로 고려하여 품질을 확장할 수 있습니다.

일정과 관련하여, 유니티는 서브스트레이트가 전반적으로 활성화된 일렉트릭 드림 데모를 GDC 2023 기간에 출시할 예정입니다.
그 다음에는 성능과 메모리 최적화를 통해 서브스트레이트의 프로덕션 준비에 집중할 예정입니다.

 

 

주의해야 할 몇 가지 제한 사항이 있습니다.

첫째, 깊이 프리패스가 필요합니다. 이는 UAV를 통해 일부 머티리얼 라이팅 재료와 클로저 데이터가 유출될 수 있기 때문입니다.
둘째, DBuffer라고 하는 별도의 데칼 누적 패스가 필요합니다. 이는 GBuffer를 더 이상 블렌딩할 수 없기 때문에 필요합니다. 따라서 데칼은 생성된 클로저에 대한 베이스 패스 후에 합성해야 합니다.

셰이더 컴파일과 관련된 몇 가지 문제도 있습니다. 베이스 패스 중에 더 많은 컴파일과 패킹 경로가 발생할 수 있습니다. 따라서 셰이더가 더 커지고 컴파일하는 데 더 많은 시간이 걸립니다. 공짜는 없지만 이 부분은 개선하고자 하는 부분입니다.

또한 탑레이어 및 SSS 데이터 버퍼를 통해 포스트 프로세스 패스와 통신하기 위해 추가로 작성해야 하는 버퍼와 관련된 추가 비용 및 오버헤드도 완화하고 싶습니다. 

마지막으로, 슬래브 파라미터화 자체가 이전에 사용했던 파라미터화에 비해 학습 곡선이 가파르기 때문에 더 많은 사용자 경험 개선 실험을 하고 싶습니다. 아티스트에게 익숙한 셰이딩 모델에 매핑하는 등 보다 간단한 파라미터화를 통해 이러한 복잡성을 추상화할 수 있는 방법을 모색할 예정입니다.

 

 

 

서브스트레이트는 앞으로 더 많은 개선 사항을 제공할 수 있는 가능성을 열어두고 있습니다:
다중 레이어 머티리얼 사이에서 발생할 수 있는 다중 굴절 및 반사 바운스에 대한 솔루션이 필요합니다.
예를 들어 형광의 메타메타리즘을 시뮬레이션하기 위해 스펙트럼 렌더링을 실험해보고 싶습니다.
마지막으로 이 프레임워크를 확장하여 볼류메트릭 콘텐츠가 있는 머티리얼, 컬러 다중 산란 효과 렌더링, 셀프 셰이딩, 뼈와 장기 등 내부 디테일 등을 지원하고자 합니다.

 

 

프레젠테이션 노트를 읽어주셔서 감사합니다!
흥미로운 논의가 있으면 언제든지 문의해 주세요.

 

 

 

언리얼 엔진용 서브스트레이트 개발 과정에서 광범위하게 활용되고 구현된 모든 논문과 서적에 대한 참고 문헌입니다.

 

 

 

시간 관계상 프레젠테이션에서 생략한 부분을 보너스 슬라이드를 통해 더 자세히 설명해 드립니다.

향후에는 각 RGB 컴포넌트에 대해 샘플링하는 데 비용이 많이 드는 4D LUT 대신 분석 솔루션을 사용하려고 합니다.

 

 

이 통계적 표현은 각 슬래브의 사안에 따른 커버리지 간 상관관계가 없다고 가정합니다.

이 통계적 표현은 각 슬래브의 사안에 따른 커버리지 간 상관관계가 없다고 가정합니다.

 

 

 

이 통계적 표현은 각 슬래브의 사안에 따른 커버리지 간 상관관계가 없다고 가정합니다.

 

이 통계적 표현은 각 슬래브의 사안에 따른 커버리지 간 상관관계가 없다고 가정합니다.

 

 

끝.