본문으로 바로가기
반응형


원문 링크 : https://unity3d.com/files/solutions/photogrammetry/Unity-Photogrammetry-Workflow-Layered-Shader_v2.pdf


본 자료는 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. 이끼




Photogrammetry를 사용하면 정성적 결과를 얻을 수 있지만 여기에 표시된 것처럼 세부 사항을 보존하려면 매우 높은 텍스처 해상도가 필요합니다.(역자 주 : 아래 16384x16384 Resoultion 사용)


이는 메모리 예산으로 인해 게임 제작에서는 비실용적이며 오브젝트에 변형(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



이 섹션에서는 HDRenderPipeline 패키지와 함께 제공되는 계층화 된 셰이더를 사용하는 방법을 보여줍니다.



2.1. 주요 재료의 텍스쳐 준비


객체의 텍스쳐를 준비하려면 사진 측량 과정을 따라 주 재료에 대한 텍스쳐 세트를 생성하십시오 (
Unity photogrammetry workflow guide​ - 5.4 텍스쳐 베이킹 참고).


어떤 텍스처는 De-lighting 프로세스에만 사용됩니다 (Unity De-Lighting Tool 문서 참조). (역자 주 : Albedo 혹은 Base color texture에 라이팅 및 음영이 들어있는 경우 의도하지 않은 결과가 나타날수 있기 때문에 기본 텍스쳐에는 이러한 De-lighting 작업이 필요하며, Unity에서도 Asset store에 De-lighting Tool을 무료로 제공하고 있습니다. 또한 Substance B2M 혹은 포토샵의 Filter등을 통해서도 이러한 작업이 가능합니다)

베이킹 도구는 주요 재질에 대한 Diffuse, Noraml map, Height map 및 Ambient Occlusion 맵 텍스처를 생성합니다. Metallic 맵, 디테일 마스크 맵 및 Smoothness 맵과 같은 주요 텍스처의 다른 텍스처를 제작해야합니다. Photoshop과 같은 모든 이미지 편집 도구에서 이 작업을 수행 할 수 있습니다.




포토그래메트리를 위해 계층화 된 셰이더를 사용하려면 다음을 수행해야합니다.

● 포토샵과 같은 편집툴을 사용해 모든 텍스처를 묶습니다.

● 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 재질을위한 텍스쳐 준비하기



포토그래메트리 과정은 Unity photogrammetry workflow guide​ - 4.2 표면을 캡처하는 방법에서처럼 레이어의 세부 정보를 가져 오는 데 사용할 수 있는 매터리얼 세트를 캡처합니다. 이 재료는 주요 재료와 달리 타일이 가능합니다. 바위 예제에서는 돌,지면 및 이끼에 대한 재료 세트가 있습니다.


주요 재료와 마찬가지로, 재료가 타일 가능해야한다는 점을 제외하고는 동일한 기대 목표에 따라 계층화 된 셰이더의 텍스처를 패킹해야합니다 (참조 
Unity photogrammetry workflow guide​ - 5.6. Tileable 소재 - Artomatix - Substance Painter).


타일 ​​가능한 재질에 디테일 텍스처 추가하기


고해상도 텍스처 같은 착각을 주기 위해 타일링 가능한 재질에 디테일 텍스처를 추가 할 수 있습니다. 디테일 텍스처는 미세한 세부 사항을 추가로 제공하는 작은 반복 패턴입니다. 이것은 계층화 된 포토그래메트리 쉐이더의 옵션 기능입니다. 디테일 텍스처를 생성하려면, Unity photogrammetry workflow guide​ - 4.2.3 디테일 텍스처에서 볼 수 있듯이 사진 측량 과정을 따르십시오. 디테일 텍스처는 base color, 노멀 맵 및 Smoothness 만 지원합니다. 계층화 된 셰이더에는 다음과 같은 패킹이 필요합니다.





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를 활성화하면 타일링 재질의 반복성이 감소하고 객체의 모양이 유지됩니다. 마스크를 사용하여 영향 효과를 필터링 할 수 있습니다.




각 구성 요소와 각 레이어에 대해 영향력 강도를 개별적으로 제어 할 수 있습니다.



다음 그림은 돌 레이어에 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 mappingPlanar로 설정하고 두 개체에 대해 동일한 월드 스케일타일링을 사용해야 합니다.



완벽한 연결을 위해서는 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