3d 모델에서 반사를 표현하는 방법

기초부터 보는 PBR shading

Featured image

3d 모델에서 반사를 표현하는 방법

부제: 기초부터 보는 PBR shading

이번주 R&D팀에서 소개할 내용은 3d 모델에서 반사를 표현하는 방법입니다.

3d 모델 파일은 obj, glb, fbx등 다양한 형식이 있습니다. 이를 게임이나 쇼핑몰 등에서 사용할 때에는 렌더링(rendering)이라는 과정을 거치게 됩니다.

렌더링에서 그림자, 재질 등을 표현하는 방법을 shading이라고 하고, 얼마나 현실의 빛을 잘 모방하는지에 따라 렌더링 이미지 퀄리티가 크게 달라지게 됩니다. 리빌더에이아이에서도 실사 에셋을 복원하고, 현실적인 가상공간 서비스 제공을 위해 shading 방법을 많이 고려하며 연구를 진행해 나가고 있습니다.

이번 글에서는 실제 3d 모델에 shading이 적용되어 우리 눈에 보이기까지의 과정을 간단하게 설명드리려고 합니다.

그림 1) 리빌더에이아이 스캐닝 예시

3D 모델을 어떻게 눈에 보이게 할 수 있을까?

눈에 보인다는 것은 3차원 공간을 2차원 이미지로 변환하는 과정입니다. 이 때 내 시점에 맞게 변환하는 과정이 필요하고, 카메라 좌표를 알고 있으면 이를 수학적으로 계산할 수 있습니다.

그림 2) 2D 이미지와 카메라 좌표계

3d 모델이란 무엇일까?

3d 모델은 포인트클라우드 정보와 폴리곤 정보를 통해 표현됩니다.

그림 3) mesh 표현 방식: pointcloud + faces

가장 대표적인 3d 모델 포맷인 obj 파일 구조를 뜯어보면 아래와 같습니다. 포인트클라우드에 대한 x,y,z 좌표(v)와 어떤 점들을 이을지에 대한 폴리곤 리스트(f)가 정의되어 있음을 확인할 수 있습니다. obj 파일 맨 첫 줄에는 어떤 mtl 파일을 사용할지(mtllib)가 정의되어 있습니다.

![2022-09-1416-14-14](https://user-images.githubusercontent.com/48865276/190088451-fd6f42e4-a848-4ab4-909c-5b957ca5c40d.jpg) 2022-09-14_16-15-15 _그림 4) obj 파일 구조

mtl 파일에는 어떤 텍스처 정보를 사용할지가 정의되어 있습니다.

![2022-09-1416-15-32](https://user-images.githubusercontent.com/48865276/190088595-e6fa0cb3-4d82-45e9-8d7c-cdaa3c747592.jpg) _그림 5) mtl 파일 예시

3d 모델을 이미지로 변환하는 방법

3d 모델을 가지고 이미지를 렌더링하는 가장 기초적인 방법은 단순하게 내가 보는 시점으로 물체를 가져오는 것입니다. 실제 절대좌표 공간(world space)에서 카메라를 원점으로 하는 좌표계(camera space)로 좌표를 변환한 후, 이미지 평면에 그대로 투영하면 됩니다.

![2022-09-1416-35-17](https://user-images.githubusercontent.com/48865276/190090816-c0ab0032-af5a-4f40-9557-db119b9d1f0b.jpg) _그림 6) 카메라 좌표변환

camera space에서 image space로 투영할 때는 다양한 방법이 있지만, 아래처럼 NDC(Normalized Device Coordinate) 좌표계로 변환하는 것이 쉽습니다. 사각뿔을 정육면체 형태로 좌표변환하면 ndc 좌표계로 변환되며, z축을 기준으로 꾹 누르면 우리가 보는 이미지가 나오게 됩니다. 이 때 z축 기준 앞에 있는 점이나 폴리곤을 이미지에 먼저 그리면 됩니다.
게임 등에서는 일반적으로 ndc 좌표계로 변환 전 사각뿔의 가장 가까운 평면(near plane), 가장 먼 평면(far plane)과의 거리를 정해놓습니다. 그래서 게임에서 일정 거리 이상 떨어지면 갑자기 물체가 없어질 때도 있습니다.

![2022-09-1416-40-48](https://user-images.githubusercontent.com/48865276/190092097-446e60ac-6a55-4aa1-bc10-f1c4fd1e85c7.jpg) _그림 7) NDC coordinates

형상을 렌더링하는 방법은 이게 끝이지만, 이렇게만 표현하게 되면 모델의 색상을 그대로 이미지에 투영하기 때문에, 그림자나 재질 표현이 불가능합니다. 따라서 shading이 필요해지게 됩니다. shading은 반사성 재질과 그림자를 고려해서 색상을 입히는 방법입니다.

빛의 반사

빛이란 무엇일까?

사진의 한 픽셀로 들어오는 빛들은 아래와 같이 나눌 수 있습니다.

투과광과 발광 정도는 일반적이지 않으므로, 보통 표면에서 반사되는 반사광(reflection)만 생각합니다. 반사광은 다시 정반사와 난반사로 알 수 있습니다.

우리는 반사에 대해 얼마나 알까?

2022-09-14_17-17-23

![2022-09-1417-14-51](https://user-images.githubusercontent.com/48865276/190099424-ce7469e8-ab41-4090-b5ad-a6683cd7fef6.jpg) _그림 8) 빛의 정반사와 난반사

빛의 “물리적” 반사 (Physically Based Rendering)

Untitled

Untitled

Untitled

난반사(diffuse) 뜯어보기

사실 정반사는 뜯어볼 게 없습니다.. ㅎㅎ

정반사(specular) 뜯어보기

PBR workflow

Untitled

Untitled

우리가 쓰는 3D 복원 방식 (for VRIN business)

  1. 빛의 반사
    • 빛이란 무엇인가
    • 빛의 각도에 따른 밝기 변화
    • 밝기 변화를 표현하려면 표면의 법선벡터(normal)가 필요하다
    • phong shading

Untitled

2022-09-14_16-51-03

2022-09-14_16-51-03

2022-09-14_16-52-29

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

Reference