블렌더/블렌더 튜토리얼

[Tutorial #01] 07. Displacement

노루3759 2024. 1. 1. 16:21
반응형

[Tutorial #01] 07. Displacement

Displacement

이제 다운받은 텍스처는 모두 연결하고 displacement만 남았습니다. 이 재질에서 displacement를 사용하지는 않겠지만, displacement가 뭔지 살펴보기만 하려고 합니다.

 

 

displacement 맵은 normal 맵을 연결했을 때처럼, displacement 노드를 중간에 하나 만들어 쉐이더로 보내줘야 합니다. 

material output 노드에 보면 재질 표면 쉐이더와 별개로 displacement라는 소켓이 따로 있습니다. 여기에 displacement 정보를 연결해 줘야 하는데, 반드시 아래 그림처럼 displacement 노드를 통해서 연결해 줘야 합니다.

 

그런데 이렇게 연결해도 displacement가 작동하지 않습니다. 블렌더에서 displacement를 사용하려면, 별도 설정이 더 필요합니다.

 

 

 

bump map, normal map, displacement map 차이

 

먼저 displacement가 뭔지 살펴보도록 하겠습니다.

 

displacement는 재질에 표면 디테일을 추가해 주는 3d 기술 중 하나입니다.

보통 bump맵과 비교가 많이 되는데, 아래 표현한 것과 같이 3d 상에서 재질의 표면을 표현해 줍니다. bump는 재질 표면이 튀어나오거나 들어간 것처럼 보이게 해주는 반면, displacement는 실제로 표면이 들어가거나 튀어나오게 해 줍니다.

 

둘 다 흑백의 이미지를 입력값으로 받아 표면 정보를 표현합니다. 높이가 높은 곳은 밝은 색으로, 높이가 낮은 곳은 어두운 색으로 표현해 상대적인 수치로 재질의 높낮이를 표현해 주게 됩니다. 

 

bump 같은 경우는 normal과 상당히 비슷하죠. normal 맵과 비슷하게 표면이 튀어나온 것 '처럼' 표현해 줍니다. normal 맵처럼 조명에 반응해 음영도 잘 표현해 줍니다. 하지만 normal과 결정적인 차이는 아무래도, 흑백 하나의 채널로 표면이 튀어나온 것처럼 표현해 준다는 점입니다. 반면 normal은 rgb 3개의 채널을 가지고 있죠. 각 채널은 x, y, z 축에 대한 표면의 법선 벡터를 나타냅니다. 이 법선 벡터로 재질 표면의 방향을 정의해 주기에, 단순히 표면 높낮이 정보로 표현해 주는 bump보다 조명 효과를 잘 표현할 수 있습니다.

 

bump나 displacement 같은 경우는 흑백으로 높이를 표현해 주다 보니, 이미지의 대비가 중요합니다. 이미지가 전체적으로 부드러우면 표면이 부드럽게 표현되고, 대비가 뚜렷해지면 높낮이 차이가 뚜렷하게 표현됩니다. 그래서 흑백의 대비가 강해지면 표면이 거칠게 표현되는 경향이 있습니다.

 

 

또는 아래처럼 노이즈를 섞어주면 표면이 거칠게 표현되죠. 기존 굴곡이 있던 벽에 웬 검은 점들이 튀어나온 것처럼 표현됩니다.

 

그래서 인터넷 등에서 찾아보면, bump는 표면의 거칠기를 시뮬레이션하기에 좋고, normal 맵은 조명 효과를 시뮬레이션 하기에 좋다... 렌더 성능에 차이가 있어 상황에 맞게 사용하면 된다... 등등 이런 식으로 표현하는 경우가 종종 있는데... 그냥 bump 말고, normal 쓰시면 됩니다. 그냥 bump보다 더 좋아요. 깊이감 있는 표현이 가능합니다.

 

 

 

Displacement map 사용하기

반면, displacement는 다르죠. 실제 메쉬를 튀어나오게 하기 때문에 더 디테일한 표면 효과를 주기 좋습니다. 아무래도 표면이 튀어나와 보이는 것 '처럼' 표현하는 것과, 실제 튀어나오는 것은 그 디테일이 다릅니다.

 

블렌더에서 실제 displacement를 사용해 보도록 하겠습니다.

 

블렌더에서 displacement를 사용하기 위해선 3가지를 염두에 두어야 합니다.

 

첫째, 사이클에서 displacement를 사용해야 합니다. 이비는 displacement를 지원하지 않습니다. 

둘째, displacement를 표현하기 위해서는 표면에 면이 많아야 합니다.

셋째, displacement는 성능을 많이 잡아먹습니다.

 

 

첫째, 사이클에서 displacement를 사용해야 합니다.

먼저, 블렌더는 사이클과 이비, 2가지 렌더 엔진이 있습니다. '왜 이비는 사이클에 비해 지원해 주지 않는 기능이 많나요?'라고 할 정도로 이비에서 지원되지 않는 기능들이 몇 가지 있습니다. 아쉬운 부분이지만, 어쩔 수 없죠.

 

displacement는 사이클에서만 사용할 수 있습니다. 아쉬운 대로 이비에서 displacement를 표현하기 위해선 쉐이더가 아닌 모디파이어 displacement를 사용해야 합니다. 아무래도 쉐이더 노드를 이용할 수 없다 보니 유연하게 사용하기 어려워 아쉽습니다. 

 

 

그런데...... 그랬는데......

블렌더 다음 버전인 4.1 버전에서는, 이비에서도 displacement를 사용할 수 있습니다.

4.1 버전에서 EEVEE 엔진의 대대적인 변화가 있을 것이라고 합니다. 이름도 EEVEE Next로 야심 차게 바꿨네요. 

언리얼 5처럼 실시간 raytracing도 지원해 줄 거라고 합니다. 이비에 Raytracing 항목이 생긴 게 보이시나요?

 

이비에서 displacement를 사용하시려면 4.1 버전을 사용하시면 됩니다.

그런데 솔직히 말하면... 저도 그냥 유튜브에서 지나가는 식으로 본 게 전부라... 이게 정말 괜찮은지 아닌지는 직접 써봐야 알 것 같습니다. 되는 것도 중요하지만 퍼포먼스가 잘 나와야죠. 유튜버들이 설레발을 치는 건지, 진짜 좋아진 건지 저도 안 써봐서 잘 모르겠습니다.

블렌더 홈페이지에서 4.1 알파 버전으로 다운로드할 수 있습니다. (저는 귀찮아서 그냥 안 쓰고 있습니다.)

 

 

 

사이클에서 displacement를 사용해 보겠습니다.

 

N을 누르면 사이드 바가 나오고, options 항목에서 쉐이더 세팅을 설정할 수 있습니다. 이 창은 이비와 사이클에서 다르게 나타납니다. 사이클 상태에서 옵션을 살펴보면, surface 항목에 displacement 항목이 따로 있습니다. 여기서 displacement only나 displacement and bump로 설정하면 displacement를 사용할 수 있습니다. 

 

 

이 옵션의 초기 세팅이 Bump Only로 되어 있어서, displacement 노드를 연결하면 기본으로 bump가 표현됩니다. 처음 블렌더를 접하시는 경우에 bump가 표현되는 것만 보고 displacement가 제대로 표현되고 있다고 착각하시는 경우가 종종 있는데, bump가 표현되는 거지 displacement가 표현되는 게 아닙니다. displacement 노드의 옵션을 건드려도 메쉬가 변하지 않습니다.

 

 

 

둘째, displacement를 표현하기 위해서는 표면에 면이 많아야 합니다.

displacement는 3d 상에서 오브젝트의 면을 실제로 움직여서 이미지의 높낮이를 표현합니다. 따라서 아래 그림처럼 오브젝트에 실제 움직일 면이 많아야 displacement가 제대로 표현됩니다. 면을 늘려줄수록 displacement의 디테일이 살아나는 걸 볼 수 있습니다.

 

 

아래 그림처럼 subdivide 모디파이어를 사용해 면을 많이 나눠줘야 displacement가 그럴듯하게 작동하는 걸 볼 수 있습니다. displacement나 bump는 종종 강하게 표현되는 경우가 있어서, scale을 좀 낮춰가면서 조절해 보시면 됩니다. 

 

scale이 커질수록 면이 튀어나오고 들어가는 범위가 커집니다. 

Midlevel을 움직여 보면 면이 튀어나오거나 들어가는 높이를 조절할 수 있습니다. 기본값 0.5에서 값을 조절해 가면 사용하시면 됩니다.

 

 

 

셋째, displacement는 성능을 많이 잡아먹습니다.

displacement는 성능을 많이 잡아먹는 작업입니다. 그도 그럴 것이, 이미지의 디테일한 정보를 3d 상으로 옮기는 작업이다 보니 3d 오브젝트에 표현 가능한 면이 아주 많아야 합니다.

 

아래 그림처럼 subdivide를 6단계까지 했는데도 이미지의 해상도를 3d 오브젝트에서 온전히 구현하기에는 턱없이 부족합니다.

 

 

그래서 subdivide를 더 해야 합니다.

2K 이미지를 제대로 구현하려면 2048 * 2048 = 4,194,304개의 면을 만들면 되겠네요.

 

아래 그림에서 보는 것처럼 면을 400만 개 정도로 subdivide 해주자 displacement가 아주 리얼하게 표현되는 걸 알 수 있습니다. 왼쪽은 와이어 프레임을 켠 상태입니다. 근데 면이 너무 많아 까맣게 보이는 것뿐입니다.

 

스크린샷으로 보는 것보다도 직접 해보면, 사진처럼 리얼하게 보일 정도로 잘 표현됩니다. 

 

문제는 도저히 이렇게 작업할 수 없다는 것이죠. 아무리 컴퓨터가 좋아졌어도 재질 하나 표현하는데 백만 개 이상의 폴리곤을 쓰기에는 너무 부담됩니다.

 

 

 

그래서 아래처럼 면을 적당히 나눈 상태에서 displacement와 bump를 섞어 적절하게 표현해야 할 필요가 있습니다. 그러면 면이 확 줄어든 상태에서 displacement를 잘 표현할 수 있습니다.

 

 

 

하지만, bump를 섞어 줘도 면이 많이 필요한 건 사실입니다. 면이 적으면 메쉬가 움직이는 것 자체가 어색해져요. 텍스처 해상도에 따라 차이는 있겠지만, 3d 상에서도 최소한의 displacement를 표현해 주기 위한 해상도는 필요합니다. 그래서 displacement는 성능을 많이 필요로 할 수밖에 없습니다. 

 

 

 

adaptive subdivision

마지막으로 adaptive subdivision을 살펴보도록 하겠습니다. 

displacement가 이미지로 재질의 표면을 표현하는 건 좋지만, 이미지의 해상도를 3d에서 온전히 구현하기 어렵다는 한계가 있었습니다. 이는 모든 렌더 개발자들의 고민이었는데, 블렌더는 그 해답으로 adaptive subdivision 방식을 제공합니다.

 

블렌더에서 adaptive subdivision을 사용하려면 사이클 렌더 아래에 Experimental 옵션을 켜줘야 합니다. 실험적이라는 뜻으로, 아직 안정화되지 않았거나 실험적인 기술을 제공해 줍니다. 사용자들에게 피드백을 제공받는 등 여러 가지 이유로 이 기능을 함께 제공합니다. 

 

 

그러면 아래처럼 섭디비전 모디파이어에서 Adaptive Subdivision 항목을 사용할 수 있습니다. 

 

 

이걸 체크하면 블렌더가 알아서 면을 섭디바이드 해줍니다. 

밑에 보면 Final Scale: Render 1.00 px, Viewport 8.00 px라고 써진 게 보입니다. 뷰포트에서는 성능을 위해 섭디바이드를 적게 하지만, f12를 눌러 렌더 했을 때 더 세밀하게 섭디바이드 해준 상태로 렌더 해 줍니다. 

 

 

이는 모델의 섭디바이드와 관계없이 화면의 픽셀을 기준으로 면을 세분화 해주는 기술입니다. 

예를 들어 기존의 섭디바이드 방식은 아래 그림처럼 카메라에서 멀리 있으나 가까이 있으나 상관없죠. A도 면은 8개, B에도 면은 8개 동일합니다. 섭디바이드로 면을 늘리면 A, B 동일하게 면이 늘어나죠.

 

반면에 렌더링 된 한 장의 이미지에서 A와 B의 픽셀 수는 다릅니다. 가로 세로 100픽셀로 한 장의 사진을 표현한다고 가정하면, A는 세로 30픽셀 정도, B는 세로 90 픽셀 정도 되겠네요. 즉, 우리가 보는 기준으로 섭디바이드를 해주는 겁니다. 멀리 있는 것은 해상도가 낮아도 되니 상대적으로 면을 적게 나눠주고, 가까이 있는 것은 면을 많이 나눠줘서 해상도를 올려주는 겁니다. 그러면 가까이 있는 건 해상도가 높아 displacement가 잘 표현되겠고, 멀리 있는 건 조금 해상도가 떨어져도 괜찮으니 면을 적게 나눠 성능에 부담을 덜어 주는 겁니다.

Dicing Scale 수치로 subdivide 되는 픽셀의 크기를 조절할 수 있습니다.

 

그런데 사실 Adaptive Subdivision도 렌더링 시에 메모리를 꽤 차지합니다. 그래서 displacement는 필요한 곳에만 사용하는 걸 추천드립니다. 

 

[Tutorial #01] 07. Displacement


[Tutorial #01] 07. Displacement
 

01. 블렌더 PBR 기본 재질
02. 블렌더 PBR 사용하기(1)

03. 블렌더 PBR 사용하기(2)

04. Normal map 적용

05. AmbientOcclusion (AO) 연결하기 (1)

06. AmbientOcclusion (AO) 연결하기 (2)

07. Displacement


 

 

반응형