
Reality Composer Pro를 이용하여 어떻게 material을 만들지에 대해 다룰 것이다.
3D scene에서 Object의 생김새를 결정한다.
단순한 하나의 색깔이 될 수도 있고, 이미지를 활용할 수도 있다.
Material은 꽤 정교함을 요하는데, 졸졸 흐르는 물을 animation 하거나 자개의 무지개 빛처럼 보이는 각도에 따라 생김새를 다른 경우 등이 있다.
또한, Material은 물체의 geometry를 바꿀수도 있다.
VisionOS의 Material은 물리 기반의 랜더링(약어로 PBR) 을 사용한다.
이를 통해 아티스트는 물리적 특성을 통해 물체의 생김새를 디자인 할 수 있다.
EX. 얼마나 metalic한지, 얼마나 rough한지.
Material은 하나 이상의 shader로 구성된다.
iOS와 iPadOS를 위해 RealityKit2에서는 Custom Material을 소개했다.
Cusom Material의 Shader는 Metal에서 Hand 코딩되었다.
VisionOS에서는 새로운 타입의 Material인 ShaderGraphMaterial을 소개한다.
이것은 VisionOS에서 custom material을 만드는 exclusive한 방법이다.

ShaderGraphMaterial는 이름에서 알 수 있듯이 네트워크 혹은 그래프나 함수 블록을 사용한다.
그리고 공개 표준인 MaterialX를 근간으로 하고 있으며, material을 정의하기에 아티스트 friendly하다.
MaterialX는 Light&Magic이라는 회사에서 2012년 만들어졌다.
ShaderGraphMaterial은 두가지 종류의 shader를 main으로 지원한다.
Physically Based는 기본적인 PBR shader이다. 간단히 사용할 때 선택하면 된다.
이 쉐이더는 각각의 property에 색깔이나 이미지 같은 상수를 통해 configure할 수 있다.
Custom Shader는 반면에 3D object의 appreance와 관련하여 정교하고 custom한 컨트롤이 가능하다.
Custom shader는 animation을 결합할 수 있고, object의 geomery를 조정하며, 특별한 효과를 제작할 수 있다.
ShaderGraphMaterial은 Reality Composer Pro에 있는 Shader Graph editor를 통해 만들 수 있다.

Reality Composer Pro를 통해 VisionOS의 Material을 만들 수 있다.
이전의 Meet Reality Composer Pro에서 한 내용에 이어서 여기에 지형적인 특성을 추가할 것이다.
[Before]
[After]
이러한 Topography map을 만들 예정
Custom 선택
두개의 노드로 구성된 shader graph가 생성된다.
Inspector Panel에서 Material Binding으로 적용
material에 position node를 추가한다. 이 노드는 3D 공간에서의 렌더링 된 위치를 반환한다.

Y 값만 추출하기 위해 seperate라는 노드를 추가한다.

더블 클릭하면 New node picker가 나온다.
Position Node 선택
Seperate Node 추가해서 연결
다음에는 분리한 Y 값은 Modulo 노드에 추가
Modulo 노드는 두 값을 나눈 나머지를 제공해준다.
그 값을 활용하면 이렇게 된다.
이렇게 노드를 추가해서 연결해준 뒤
Input 값을 설정해준다.
ifgreater 노드를 통해 선의 영역을 구한다.
조건에 따라 다른 색을 사용할 것이므로, Output type을 RGB로 설정 한다.
비교 할 값과, 반환할 색상을 정해준다.
연결.

노드 그래프는 복잡한 material을 단순화하는데 도움을 주고, 그래프의 일부를 재사용하기 위해 나만의 노드를 만들 수도 있게 해준다.
지금까지 만든 4개의 노드를 Draw Lines 노드 하나로 만들어서 재사용하는데 활용한다.

4개 선택해서 Compose Node Graph를 선택하면 하나의 노드로 바뀌는 것을 확인할 수 있다.
하나로 바뀐 노드의 이름을 Lines로 바꿔준다.


두번째 선을 만들기 위해 Lines 우클릭 -> Create Instance

인스턴스는 orignial node graph에 대해 다양한 변화들을 적용할 수 있는 Live Copy이다.
Seondary Line 노드를 추가했고, Origianl과 다른 간격과 색을 주고 싶어서 Orignial Node를 변경하여 Spacing과 Color input을 주기위해 Lines를 더블 클릭한다.

Inspector Panel에서 두 input을 추가하고 그 값들을 연결해준다.
각 노드에 적절한 Input값을 넣어준다.
Multiply node를 통해 두가지 색을 결합시킨다.
custom material의 기능으로 model을 실시간으로 변화시킬 수 있다.

Disk Model: plain geometry를 포함한 base surface.
그리고 2D data인 Height data와 geometry modifier를 활용하여 terrain을 정도에 맞게 raise 시킨다.

다시 설명하자면
요것이 우리의 flat model이고

geometry modifier를 이용하면 height map을 통해서 vertex들이 조절되게 된다.

이를 위해선 일단 deactivate 명령을 써야하는데, 이는 모델의 prebuilt된 것들을 숨기기 위해서다.

Flat model을 root에 넣어준다.

새로 만들어둔 매테리얼을 disk에 할당한다.

Gemetry Modifier를 연결해준다.

Yosemite image를 넣어준다.


이번엔 height 정보가 포함된 exr 이미지를 넣어준다.

Geometry modifier를 통해 model의 vertice를 어느 방향으로든 움직일 수 있지만, 우리는 지금 수직 방향에만 관심이 있으므로 combine3 node를 추가해준 뒤, geometry modifier와 연결해준다.

Vertex를 움직일 때, 새로운 terrain 모양에 맞추기 위해 surface normal vector도 설정이 필요하다.
hegith data에서 이 값들을 계산하는 방법도 있지만 이번에는 이미 계산된 normal 값을 포함한 이미지를 활용할 것이다.
그래서 새로운 이미지 노드를 추가해준다.

surface는 normal의 값이 1에서 -1 사이로 요구하고 있는데 이미지에 있는 값은 0에서 1이다. 따라서 remap을 이용해준다.

이제 우리는 flat geometry에서 height data를 통해 terrain을 생성할 수 있게 되었다.
이제 yosemite와 catalina를 자연스럽게 전환하도록 만든다.

catalina에 대한 새로운 Image set을 추가한다.

여기에 constant mix node를 추가하면 그 값에 따라 적절한 terrain들이 나타난다.

Promote command를 통해 swift code를 통해 값을 변경할 수 있도록 만들어준다.
