본 자료는 2018 beta 버젼을 기준으로 작성되어있으므로 2018.1 버젼에서 변경사항이 있을수 있습니다. 2018.1 HDrender pipeline에서의 적용 및 활용은 테스트후에 문서 갱신할 예정.
본문 내용으로 HDRenderPipeline에서 Material 셋팅 및 각각의 Shader에서의 옵션들이 어떤 역할을 하는지 살펴볼 수 있다.
HDRenderpipeline shader에서의 on_Render 설정은 DX11, PS4, XBOX one, vulkan, metal, switch로 define되어있다.(모바일도 vulkan이면 될거 같기도.....ㅎ). 게임이라면 콘솔이나 PC에서도 비쥬얼이 중요한 플젝들, 그리고 비게임 부분에서도 폭넓게 사용할수 있는게 HDRP라서 잘쓰면 매우 좋은 퀄리티를 낼 수 있다.
덧 : 개인적으로 공부용 참고용으로 퍼가는건 상관없는데 생각없이 문서 내용 다 긁어다가 자기 블로그 홍보에 쓰시는분들은 갱신될 여지가 많은 내용이므로 링크로 좀 가져가셨으면 하는 작은 바램이....(당신들 퍼가는건 5분이면 되지만 이런 문서들 번역이나 튜토리얼 만드는데 적게는 서너시간 유나이트 발표 자료 같은건 한두달 걸립니다.)
Author : Sébastien Lachambre
Layering materials in Unity
1. Overview
이 문서는 포토그래메트리를 사용해 실제세계의 오브젝트와 material을 캡처하는 방법을 보여주는 Unity photogrammetry workflow guide를 기반으로 합니다.
이 단계별 가이드는 계층화 된 셰이더를 사용해 Unity photogrammetry workflow guide에 표시된 것과 동일한 수준의 품질을 얻는 방법을 보여 주지만, 게임에서의 요구에 맞추기 위해 텍스처 메모리 예산을 최적화 하는 방법을 다루고 있습니다.
이 문서에 사용 된 예제는 다음을 포함합니다.
● 바위, 땅, 나무 뿌리들로 만들어진 주요 오브젝트
● 각종 소재 :
1. 돌
2. 지면의 요소(등뼈로 혼합된)
3. 이끼
이는 메모리 예산으로 인해 게임 제작에서는 비실용적이며 오브젝트에 변형(variants)을 추가 할 수 없습니다.
객체에 변형을 추가하려면 다음 쉐이더 중 하나를 선택해 사용할 수 있습니다.
● 일반 쉐이더(Regular Shader)
● 계층화 된 셰이더(Layered Shader)
● 매터리얼 계층화를 위한 계층화 된 셰이더(Layered shader for material layering)
일반 쉐이더(Regular Shader)
일반 쉐이더는 하나의 머티리얼에 대한 시각화를 정의합니다(역자주 : 셰이더는 화면에 어떻게 그릴지에 정의된 코드). Unity photogrammetry workflow guide - 4.1 How to capture an object에서 보여지듯, 게임 오브젝트와 같이 오브젝트 별로 매터리얼을 가지고 표시하면 모든 매터리얼이 합쳐지게 되므로 품질이 떨어질 수 있습니다.
계층화된 쉐이더(Layered Shader)
계층화 된 셰이더는 개별 매터리얼의 조합으로 비쥬얼을 정의합니다. 위의 그림에 표시된 주요 재료는 돌,지면 요소 및 이끼의 다른 재료와 혼합되어 있습니다. 이 다른 매터리얼들은 tileable(역자 주 : Tiling 된 texture를 의미)입니다. 즉, 오브젝트를 둘러 쌀 수 있고 다른 객체에 다시 사용할 수 있습니다. 메터리얼의 조합을 사용하면 고해상도 텍스처와 비슷한 시각 품질을 가질 수 있지만 (텍스처의 비슷한 텍셀 밀도 에서처럼) 해상도가 낮은 텍스처를 사용하게 되므로 메모리를 절약합니다.
계층화 된 셰이더를 사용하면 애셋간에 텍스처를 공유하고 변형 가능한 매터리얼을 조합하여 변형(역자 주 : 다양함. variants)을 추가 할 수 있습니다. 이렇게하면 저렴한 비용으로 대규모 월드를 쉽게 채워 나갈 수 있습니다.(역자 주 : 오브젝트 메쉬는 다양하게 있더라도 텍스쳐 및 매터리얼, 혹은 셰이더를 반복사용할 수 있기 때문에. 특히 Texture Resource를 재사용/타일링은 Texture Resource가 메모리에서 차지하는 양을 크게 줄여줄 수 있다)
Layered shaders for material layering
Scriptable Render Pipeline 패키지와 함께 제공되는 HDRenderPipeline 계층화 셰이더를 사용하여 재질을 결합 할 수도 있습니다. 여기 Github에서 다운로드 할 수 있습니다.
역자 주 : 2018.1 부터 Unity Hub에서 HD Renderpipeline 템플릿을 선택하면 손쉽게 HD Render pipeline을 사용할 수 있습니다. 따로 Github등 외부 링크에서 다운로드해 Project에 Setting하는 것이 아닌 새 프로젝트가 생성될때에 필요한 에셋들을 자동으로 다운로드 받아 프로젝트에 셋팅해줍니다.
이 계층화 된 셰이더에는 포토그레메트리로 제작된 오브젝트를 대상으로하는 전용 옵션이 있습니다.
2. Using Layered shader for Photogrammetry
2.1. 주요 재료의 텍스쳐 준비
객체의 텍스쳐를 준비하려면 사진 측량 과정을 따라 주 재료에 대한 텍스쳐 세트를 생성하십시오 (Unity photogrammetry workflow guide - 5.4 텍스쳐 베이킹 참고).
● Diffuse texture에 De-lighting 작업을 합니다.
● 베이킹 단계에서 하이트맵 정보를 저장하십시오.
Base Color : 베이킹 + 디 라이팅으로 base color를(Albedo) 만듭니다 (Unity De-Lighting Tool 문서 참조).
Normal map : 탄젠트 공간에서 베이킹하여 노멀 맵을 생성합니다.
Height map : 베이킹으로 하이트 맵을 만듭니다. 베이킹 도구는 높이 맵 샘플링을 위한 최소, 중간 및 최대 값을 제공합니다. 이 값을 저장하거나 기록한 다음 Unity Editor에서 레이어 쉐이더에 정의하십시오.
Mask map : 포토샵에서 Linear 합성 맵을 만듭니다. R 채널은 Metallic 마스크입니다. G 채널은 앰비언트 오클루젼 전용입니다. B 채널은 세부 마스크입니다. 알파 채널은 Smoothness값을 위한 것입니다.
다음 다이어그램은 마스크 맵의 채널을 보여줍니다.
2.2. tileable 재질을위한 텍스쳐 준비하기
타일 가능한 재질에 디테일 텍스처 추가하기
2.3. 매터리얼 설정
유니티 에디터에서 HDRenderPipeline 라이팅 셰이더를 생성하려면 먼저 머티리얼을 생성하십시오. 프로젝트 탐색기를 오른쪽 클릭하고 Create > Material 선택 :
기본적으로 Lit Shader를 생성합니다.
그런 다음 텍스처를 적절한 슬롯에 드래그 앤 드롭합니다.
하이트 맵은 테셀레이션 또는 픽셀당 변위(Displacement)의 경우에 사용됩니다. 이 문서의 암석 예에서는 하나의 주요 재료와 3 개의 tileable 재료가 생성됩니다 (돌, 지형 요소 및 이끼 용)
2.4. 계층화 된 셰이더 설정하기
2.4.1. 계층화 된 셰이더 만들기
에디터에서 HDRenderPipeline 레이어 쉐이더를 생성하려면 프로젝트 탐색기를 마우스 오른쪽 버튼으로 클릭하고 Create> Material을 선택합니다 (2.3 재료 설정 참조).
그런 다음 새 머티리얼에서 HDRenderPipeline> LayeredLit 셰이더 (또는 테셀레이션을 사용하려면 LayeredLitTessellation 셰이더)를 선택합니다.
Demo Project가 아닌 HDRenderpipeline Template에 포함된 Shader 리스트는 위 이미지와 달리 6개만을 기본으로 제공하고 있습니다.
Material type은 standard를 기본으로 진행합니다.
계층화 된 쉐이더는 최대 4 개의 레이어를 지원합니다. 첫 번째는 메인 레이어 다른 말로는 레이어 1, 레이어 2 및 레이어 3라고합니다. 각 레이어는 Base Color, Normal map, Smoothness map 및 세부 텍스처의 일반적인 속성을 포함하는 일반 메티리얼과 같습니다.
레이어는 맨 아래의 머티리얼을 맨 먼저, 맨 위의 머티리얼을 마지막으로 사용하여 중요도 순서대로 나타납니다. 예를 들어, 레이어 1에는 돌을, 레이어 2에는 돌 위에 이끼가 있고 레이어 3에는 이끼 맨 위에 축적 된 먼지가 있을 수 있습니다.
이 문서에서 사용 된 암석 예에서는 이끼가 LOD 재료에서 제거 될 수 있도록 레이어 3으로 설정됩니다.
비에 의해 씻겨 나갈 수 있기 때문에 먼지는 이끼보다 덜 중요합니다. 이 순서를 사용하면 LOD 매터리얼을 생성할 때 마지막 레이어를 제거 할 수 있습니다. 이 문서에서 사용 된 암석 예에서는 이끼가 LOD 재료에서 제거 될 수 있도록 레이어3로 설정됩니다.
셰이더의 비용은 레이어 및 텍스처의 수에 따라 다릅니다. 레이어가 많으면 비용이 많이 듭니다.
Inputs의 Layer Count 항목에서 레이어 수를 조절할 수 있습니다.
계층화 된 셰이더에서 직접 레이어 속성을 설정할 수 있습니다. 그러나 레이어 쉐이더를 사용하면 조명 쉐이더에서 레이어로 속성을 복사 할 수 있습니다. 이를 통해 다양한 레이어 및 조명 쉐이더 간의 재질 속성을 공유하여 변형을 추가 할 수 있습니다. 이 문서에서는이 방법을 사용하는 방법을 보여줍니다.
매터리얼 레퍼런스 섹션을 사용하여 조명 재질의 특성을 해당 레이어에 복사합니다. 자료가 로드되면 Re-Synchronize 버튼을 클릭하여 사본을 수행하십시오
이 설정을 사용하면 Lit Shader Maaterial을 업데이트하고 다양한 계층화 된 매터리얼의 변경 사항을 복제 할 수 있습니다.
다양한 레이어는 아티스트가 설정 한 가중치에 따라 혼합됩니다. 정점 색상, 레이어 마스크 및 높이 맵 마스크와 같이 가중치를 정의하기 위해 서로 결합하는 많은 가중치 옵션이 있습니다. 이 문서의 예제에서는 레이어 마스크를 사용합니다.
2.4.2. 레이어 마스크 설정
레이어 마스크를 사용하여 레이어 가시성을 유도합니다. sRGB를 선택하지 않은 상태에서 텍스처를 선형 텍스처로 가져와야합니다. 각 채널은 레이어의 가시성을 관리합니다.(역자 주 : 가시성은 보여지는 정도, 해당 채널의 세기를 이야기 한다)
2.4.3. 영향 모드(influence mode) 설정하기
이 문서의 시작 부분에서 설명한 것처럼이 예의 객체는 주 재료와 주재료 위에 타일링 가능한 재료로 구성됩니다. Main Layer Influence 옵션은 주재료가 다른 레이어 (레이어 1, 2, 3)에 영향을 미치도록 합니다. 그런 식으로, 주요 재료는 기본 색상, 정상 및 다른 레이어의 높이에 영향을 미칠 수 있습니다. Main Layer Influence를 활성화하면 타일링 재질의 반복성이 감소하고 객체의 모양이 유지됩니다. 마스크를 사용하여 영향 효과를 필터링 할 수 있습니다.
각 구성 요소와 각 레이어에 대해 영향력 강도를 개별적으로 제어 할 수 있습니다.
2.4.4. 밀도 모드
Base color 텍스처의 알파 채널을 설정하여 텍스처의 불투명도 또는 텍스처의 밀도를 사용할 수 있습니다. 각 레이어에 대해 Use Opacity map as Density map을 선택하거나 선택 취소하여이 작업을 수행합니다.
Use Opacity map as Density map을 활성화하면 기본 색상 텍스처가 알파 채널을 사용합니다.
이 밀도 맵은 레이어에 대해 표시되는 요소의 밀도를 정의합니다. 정점 색상은 밀도 맵의 임계 값을 제어합니다. 밀도 맵은 회색조이며 직접 만들었습니다. 흰색 요소는 가시성에 의해 정렬됩니다.
첫 번째와 검은 색 요소가 지속됩니다. 레이어의 정점 색상 (빨강 : 레이어 1, 녹색 : 레이어 2, 파랑 : 레이어 3)이 1에 가까울 때 레이어가 더 잘 보입니다.(역자 주 : 텍스쳐 밝기값이 0 >> 1로 갈수록 잘 보임)
참고 : 임계 값은 정점 색상의 역입니다. 임계 값보다 높은 밀도 맵 안의 모든 값은 레이어를 표시합니다. 이것은 덧셈 과정이기 때문에 여기에 반전이 있습니다.
2.4.5. Rock dragon 계층화 매터리얼 예제
다음 스크린 샷은 이 문서에서 사용 된 락 드래곤 예제를 렌더링하는 계층적 셰이더 설정을 보여줍니다. The Main Layer Influence 옵션은 메인 레이어가 돌 레이어에 영향을 미치도록 레이어 쉐이더에 설정됩니다.
Main layer settings in the dragon rock example
메인 레이어 만 보여줄 때의 텍스처 :
다음 스크린 샷은 셰이더의 각 레이어에 대한 설정을 보여줍니다. Use Opacity map as density 옵션은 지면 요소 및 이끼 레이어에 대해 활성화됩니다. 돌 레이어에 대한 레이어 1 설정은 다음과 같습니다.
바위 (메인 레이어)와 돌 (레이어 1)을 보여주는 텍스처 :
Dragon rock 예에서 바닥 레이어에 대한 레이어 2 설정
바위 (메인 레이어), 돌 (레이어 1) 및 그라운드 요소 (레이어 2)를 보여주는 텍스처 :
Dragon Rock 예에서 이끼 층의 레이어 3 설정
바위 (주요 층), 돌 (층 1), 지표 요소 (층 2) 및 이끼 (층 3)를 보여주는 텍스처 :
다음 스크린 샷은 조명이있는 게임 내 결과의 예를 보여줍니다.
각 레이어별 셋팅에 따른 스크린샷 비교
2.5. Influence mde가 없는 포토그래메트리 오브젝트
포토그래메트리 자료를 매터리얼 작성에만 사용하고 가상 오브젝트에 맵핑 할 수 있습니다. 다음은 계층화 된 셰이더의 Main Layer Influence 옵션을 사용하지 않는 지형의 예입니다. 대신에 타일 가능한 4 개의 재질을 사용합니다.
각 사진에서 네 개의 주요 표면을 식별 할 수 있습니다.
이걸로 4 개의 Lit material을 생성합니다.
HDRenderPipeline 계층화 된 셰이더를 사용하여 텍스처를 설정하려면 4 개의 레이어가있는 계층화 된 셰이더를 만들어 이를 그라운드 오브젝트에 적용해야합니다. 그런 다음 버텍스 컬러를 사용해 바닥 오브젝트를 칠할 수 있습니다. 레이어가 다르게 구성되므로 버텍스 컬러가 다릅니다.
2.6. 오브젝트를 그라운드와 연결하기
두 개의 완벽한 객체를 연결하려면 공통된 매터리얼을 사용해야합니다.
이렇게 하려면 공통 매터리얼에 대해 Base UV mapping을 Planar로 설정하고 두 개체에 대해 동일한 월드 스케일 및 타일링을 사용해야 합니다.
완벽한 연결을 위해서는 3ds Max 또는 Maya와 같은 3D 그래픽 소프트웨어에서 메쉬 노말을 조정하십시오.
'Technical Report > Graphics Tech Reports' 카테고리의 다른 글
Unity only LIght Probes bake test (0) | 2018.11.02 |
---|---|
Unity Texture Arrays (0) | 2018.10.14 |
[번역]Working on Lighting for Video Games (0) | 2018.05.13 |
FBX exoprt Animation options (0) | 2018.05.09 |
ASTC Format (2) (0) | 2018.03.22 |