2.1. Architecture

머티리얼은 픽셀 셰이더와 버텍스 셰이더를 사용하여 렌더링한다.

계산 CPU, GPU 그래픽카드

두 셰이더는 버텍스와 픽셀을 계산하여 최종 이미지에 기여하는 역할을 한다.

두 셰이더는 최신 리얼타임 렌더러의 렌더링 파이프라인에서 매우 핵심적인 역할을 한다.

픽셸 셰이더는 플랫폼마다 다르다. HLSL로 작성되는 셰이더는 DirectX와 Windows PC에서 사용된다.

다음 그림은 리얼타임 렌더러의 처리 방식이다.

Untitled

다음은 언리얼 엔진 렌더러 동작 흐름

Untitled

이걸 매번 활용할 때마다 특정 렌더링이 필요하기 때문에 생성된 셰이더는 반드시 상당수의 퍼뮤테이션을 지원해야 한다. 지나치게 많은 기능을 동일한 셰이더에서 지원할 수는 없을텐데 그건 비효율적이다. 따라서 언리얼 엔진은 보이지 않는 곳에서 자동으로 사용자도 모르는 사이에 여러분이 만드는 머티리얼마다 다양하고 수많은 버전들을 생성한다.

Untitled

(2) 모든 제네럴 기능이 컴파일된 특정 셰이더를 생성했습니다.
(3) 하지만 이 셰이더가 이 정적 조명(라이트 매핑) 상자에서 사용되면…
(4) 나머지 기능에 라이트맵을 혼합하는 데 필요한 코드가 없습니다.
(5) 따라서 이 사용 시나리오를 위해 추가 코드가 삽입된 두 번째 셰이더 버전이 생성됩니다.

(2) 모든 제네럴 기능이 컴파일된 특정 셰이더를 생성했습니다. (3) 하지만 이 셰이더가 이 정적 조명(라이트 매핑) 상자에서 사용되면… (4) 나머지 기능에 라이트맵을 혼합하는 데 필요한 코드가 없습니다. (5) 따라서 이 사용 시나리오를 위해 추가 코드가 삽입된 두 번째 셰이더 버전이 생성됩니다.

2번에서 셰이더가 생성되면 셰이더와 머티리얼이 3번의 박스에 사용된다고 하자. 이때 3번의 박스는 스태틱 라이팅이 적용되므로 라이트 매핑이 된다. 특정한 기능이 이 박스에만 적용되는 것이다. 여긴 라이트맵이 있는데 다른 데는 전혀 없다. 따라서 셰이더는 다른 기능과 함께 라이트맵에 블렌딩하는데 필요한 코드가 없을 것이다. 특정량의 코드를 추가한 다음 우리한테 있는 기능은 이게 전부라고 할 것이다. 이제 새로운 기능(5번의 아래 노란색 하단 텍스트 참고)을 추가하여 이 특정 상황을 해결해보자. 이제 새로운 버전의 셰이더가 만들어졌다. 매번 사용 상황에 맞부딪칠때 마다 똑같은 작업을 할 것이다. 셰이더를 복사한 다음 새로운 버전에서 코드의 특정 부분을 변경할 것이다. 그러면 언리얼 엔진에서는 셰이더를 컴파일해야 한다. 하지만 800개가 나올 일은 없을거라고 생각 할 수 있다. 그럼 언리얼 엔진을 뭘 하고 있을까? 셰이더 퍼뮤테이션을 빌드하고 있다. 퍼뮤테이션의 제어 일부는 디테일 패널의 ‘Usage’ 롤아웃에서 이루어진다.

머티리얼 에디터를 실행한 상태로 디테일 패널의 하단을 보면 ‘Usage’ 롤아웃이 있다. 바로 이것을 활용하는 것이다. 예컨대 생성된 라이트맵이 있는 그 박스 예제는 ‘Used with Static Lighting’을 활성화할 것이다. 이건 기본적으로 셰이더에게 라이트맵과 기타 속성들에 블렌드할 준비가 된 버전을 만들라고 알려주는 것이다. 해당 옵션을 활성화하면 언리얼 엔진에서는 이 활용 상황에 맞는 두 번째 셰이더 퍼뮤테이션을 빌드할 것이다.

그렇다고 해서 셰이더가 수만개씩 생기는 이유가 설명되지 않는다. 백그라운드에서는 다른 일도 벌어지고 있다. 그 중 일부는 에디터에 노출되지 않는다.