[Tutorial #01] 06. AmbientOcclusion (AO) 연결하기 (2)
Ambient Occlusion Bake
이렇게 베이크 된 이미지를 오브젝트에 연결하면, 컴퓨터가 ao를 계산하지 않아도 텍스처로 ao를 표현할 수 있게 됩니다. 파란 원통과 박스 사이에 음영이 표현되는 게 보입니다.
하지만 이 방법은 텍스트에 기록된 정보를 사용하다 보니 ao가 실시간으로 적용되지는 않죠. 원통을 치워보면, 원통으로 생긴 그림자가 그대로 남아있습니다. 실시간으로 계산된 정보가 아니라 이미지의 정보를 그림자처럼 사용했기 때문입니다.
ao가 이미지로 표현되기 때문에 이제 아래 그림처럼 mixColor 노드를 사용해서 색을 블렌딩해 줄 수 있습니다.
관련 내용은 mixColor 노드에 자세히 설명해 놓았으니 참고해서 보시면 됩니다.
Ao 맵은 어두워 져야 할 그림자 영역을 검은색으로 표현하고, 나머지는 밝은 흰색으로 표현해 줍니다. 그러면 어디가 그림자 져야 할 곳인지 직관적으로 알아볼 수 있죠.
따라서 밝은 곳은 원본의 색을 그대로 나타낼 수 있고, 어두운 곳은 블렌딩되어 어두운 영역의 정보를 표현해 줄 수 있는 multifly 블렌딩이 잘 어울립니다. 또 곱연산되는 특성상 0보다 어두운 검은색을 만들지 않아, 그림자 영역의 디테일을 살릴 수 있어서 좋습니다. 다만 색이 전체적으로 어두워질 수 있어서, 대비를 강하게 해 주기 위해 overlay를 사용할 수도 있습니다. 그러면 어두운 곳은 어두워지고, 밝은 곳은 밝아지겠죠.
A에는 원본, B에는 블렌딩하려는 AO 텍스처를 연결해 줘야 하겠죠.
역시 아래처럼 colorRamp를 중간에 하나 달아서, 그림자의 변화를 눈으로 보면서 조절하시면 됩니다.
살펴 좀 김에, ambient occlusion을 베이킹할 때 유의할 점 두 가지만 더 언급해 보도록 하겠습니다.
빨간색 박스 친 곳에 알 수 없는 검은 줄이 있는 게 보이시나요? ambient occlusion 베이킹이 잘 못되었기 때문입니다. uv를 잘 못 펴서 일 수도 있고, 설정 문제일 수도 있습니다. 여기서는 uv가 잘못되었기 때문에 검은 줄이 생겼습니다.
uv에 겹친 부분도 없어야 하지만, 이 경우에는 uv 간격이 너무 빽빽합니다. 이미지에는 적정 margin이 필요합니다.
uv의 가장자리나 경계 부분에 일정한 여유 공간을 두는 margin이 필요합니다. 이미지를 정확한 위치에 위치하도록 할 수 있고, 그림자 효과나 흐려지는 효과 등 디자인을 정확하게 전달하기 위한 여유 공간이 필요한 것이죠.
uv 사이의 간격에 조금 더 여유를 두어 다시 baking 해보면,
uv 사이의 여유 공간에서 이미지가 부드럽게 변화되는 게 표현됩니다. uv가 너무 빽빽하면 이런 색 변화가 부드럽게 이어지 못할 수 있습니다. 이미지다 보니 부드럽게 그라데이션 지는 효과가 픽셀로 표현되어야 할 필요가 있죠.
ao가 이상하게 표현되는 현상이 없어졌습니다.
또 하나는 ao 이미지에 노이즈가 너무 많이 보입니다. 검은색에서 흰색으로 부드럽게 변화하는 모양으로 표현돼야 하는데 검은색에 흰 점이 군데군데 박힌 것처럼 보입니다.
노이즈란 잡음이나 소음을 의미하는 말로, 이미지를 부드럽게 표현하는데 방해가 되는 이런 얼룩들이 노이즈로 나타납니다.
사실 이런 노이즈는 빛을 추적해서 계산하는 과정에서 발생하는 잡음 같은 것인데, 렌더러가 피할 수 없는 기술적인 문제입니다. 사이클은 빛을 추적하고 그 과정을 고려해서 0.9의 검은색인지, 0.7의 검은색인지 계산해서 화면에 표현해 주는데, 이 과정이 너무 오래 걸립니다. 그래서 모든 계산을 다 하지 않고 sample을 뽑아 계산하게 됩니다.
렌더를 정확하게 하자니 시간이 오래 걸리고, 빨리하자니 샘플이 부족해 노이즈가 생기게 됩니다. 그래서 노이즈를 없애려면 sample을 올려야 하지만, 시간이 오래 걸립니다.
저는 Noise Threshold 항목을 끄고 bake 하였습니다. 노이즈가 Noise Threshold 보다 작아질 때까지 샘플을 수집할 수 있게 하는 임곗값을 의미합니다. 임곗값을 낮추면 샘플을 많이 수집해서 더 좋은 결과를 얻을 수 있지만 렌더 시간이 증가합니다.
확실히 ao의 노이즈가 사라져 그림자가 부드럽게 보입니다.
그런데... 블렌더는 베이킹 속도가 느려 저는 블렌더에서 베이킹을 하지 않습니다. 다른 프로그램에서 베이킹하게 되더라고요. 퀄리티를 높이면 속도가 생각보다 많이 느립니다.
ao는 이렇게 텍스처로 표현해 줄 수 있지만, 앞에서도 설명했듯이 블렌더 자체적으로 ao를 잘 계산해서 표현해 줍니다. 따라서 블렌더에서 ao를 베이크 해서 사용하기보다는 ambient occlusion 옵션을 그냥 켜서 사용하는 걸 추천드립니다. ao를 텍스처로 베이킹해서 사용하면, 씬에서 오브젝트를 옮기거나 수정할 때마다 baking 해야 합니다. 블렌더에서 게임 엔진으로 데이터를 옮기기 위해 베이킹하는 게 대부분이지, 블렌더 자체적으로 사용하려고 베이킹하는 경우는 거의 없습니다.
이 옵션 켜서 느려지는 게 부담스러울 정도라면... ao baking을 하기보다 컴퓨터를 업그레이드하는 걸 추천드립니다.
ao 텍스처는 어디까지나 텍스처로 음영을 표현하기 위한 꼼수에 가깝습니다. 그래서 이렇게 렌더를 제공하는 프로그램 보다도, 게임상에서 음영을 표현하기 위해 더 많이 쓰입니다. 실시간으로 3d 정보를 제공해야 하다 보니 성능에 더 신경 써야 하죠. 게다가 게임은 ao만 필요한 게 아니죠. 여러 가지 3d 정보, 게임 정보들을 실시간으로 제공해야 하니 성능에 더 민감할 수밖에 없습니다. 1초씩 뚝뚝 끊기는 게임을 누가 좋아하겠습니까. 그래서 비싼 ao 연산 대신, 꼼수로 빛의 정보를 전달해 주는 ao 텍스처를 사용하게 됩니다.
더군다나 언리얼 5가 루멘과 나나이트 기술을 공개하면서 실시간 렌더 엔진의 기술 변화도 예고했습니다. 음영 표현을 ao 텍스처로 사용하는 방법 대신, 음영 표현은 렌더 엔진 자체에 맡기는 방법으로 기술이 발전하고 있습니다.
기술이 발전해서 더 이상 ao texture를 사용하지 않게 되면, ao texture 방식 자체가 렌더 기술 발전의 과도기에 잠시 사용되던 방법으로 기록될지도 모르겠네요.
Ambient Occlusion Image Texture
두 번째는 오브젝트의 미세 표면에서 발생하는 음영을 살펴보겠습니다. 미세 표면에서도 이렇게 어두운 영역이 발생할 수 있습니다.
아래 그림 같은 돌바닥을 보겠습니다. 우리가 돌 틈새 하나하나까지 직접 만들 수는 없습니다. 그래서 이런 미세 표면은 이미지를 입혀서 표현하죠.
평면에 아래 그림 같은 PBR 돌 텍스쳐를 적용시켜 보았습니다.
rendered 모드로 들어가서 살펴보면, 이비고 사이클이고 아래처럼 잘 표현됩니다. 빨간색 화살표를 따라 빛이 들어오는데, 빛을 많이 받는 곳과 적게 받는 곳이 잘 구별됩니다. 평면인데도 마치 입체적인 것처럼 보이는 이유는, 밝은 영역과 어두운 영역을 렌더러가 표현해 주었기 때문입니다. 돌 사이 틈새에 그림자가 표현되는 것을 불 수 있습니다.
이전에 살펴본 것처럼, 이런 시각적인 음영은 노멀 맵이 만들어 줍니다. 노말 맵이 없으면 빛에 따른 음영이 표현되지 않습니다. 그래서 사실적인 표현을 위해 노말 맵이 아주 중요합니다.
이렇게 오브젝트 사이에서도 음영이 필요하고, 이미지 안에서도 표현돼야 합니다. 그래야 더 리얼하게 표현되죠. 실제 세상에서는 미세 표면이 존재하는데 3d 상에서는 이걸 이미지로 표현해 주는 것이죠. 노멀맵이 알아서 음영을 잘 표현해 줍니다.
그런데 가끔 보면 재질 텍스처에서 물체 표면의 ao 이미지를 함께 제공해 주는 경우가 있습니다. 아래 그림처럼 말이죠. 모델 자체가 튀어나오고 들어간 오브젝트라면 블렌더가 알아서 ao를 만들어 줄 텐데, 평면에 이런 텍스처로 재질을 표현하는 경우라면 블렌더가 ao를 만들지 못하겠죠. 평면이니까요. 그래서 텍스처 재질의 굴곡을 따라 AmbientOcclusion을 함께 제공해 주는 경우가 있습니다. 여기서 ao 이미지만 봐도 어디가 튀어나오고, 어디가 들어갔는지 알 수 있을 정도로 음영 표현이 잘 되어 있습니다.
그래서 '노멀맵도 쓰고, 거기에 AO 맵도 사용하면 더 사실 같아 보이겠다'해서 사용해 보면...
아래 그림처럼 음영 표현보다는 그냥 텍스처가 어두워지기만 할 때도 종종 있습니다.
물론 장면에 따라 다르고, 사람마다 다르게 느낄 수도 있지만... ao 맵은 기본적으로 노멀맵처럼 빛에 따라 음영을 표현해 주지 않습니다. 음영이 져야 할 부분에 어두운 색을 더해줄 뿐입니다. 그래서 보는 각도에 따라 음영을 느끼게 해주기는 커녕 이미지를 어둡게 만들기만 할 수도 있습니다. 재질을 표현하는 오브젝트가 실제 굴곡진 게 아니라, 평면이기 때문에 보는 방향과 상황에 따라 ao 맵이 너무 과해 오히려 더 어색해 보일 수도 있습니다.
이럴 때는 역시 colorRamp와 mixColor 노드의 factor 값을 바꿔 ao가 섞이는 정도를 조절하면 됩니다. 어두워지는 정도를 보면서 컨트롤할 수 있습니다. 아니면 아예 ao 맵을 사용하지 않는 것도 좋은 방법입니다. normal 맵 자체가 음영을 잘 표현해 줍니다. 보통 재질에 사용하는 ao는 사용자의 취향에 따라 호불호가 좀 갈리는 것 같기는 합니다.
보통 이렇게 ao 맵을 주는 경우는 아래처럼 displacement를 함께 주는 경우도 많습니다.
displacement는 실제 폴리곤을 위아래로 튀어나오게 만들어 오브젝트에 굴곡을 만들어 줍니다. 이렇게 폴리곤이 실제로 튀어나와 굴곡을 만드는 경우에는 ao맵을 사용하면 더 좋죠.
왼쪽은 ao를 사용하지 않았고, 오른쪽은 ao맵을 사용했습니다. 빛이 덜 들어가야 하는 하는 영역이 더 어둡게 표현된 걸 관찰할 수 있습니다. 사실 이 어두운색은 ao맵이 만들었습니다.
Ambient Occlusion node
오브젝트의 ao를 블렌더가 자체적으로 만들어 준다고 해서 ao 텍스처가 완전 필요 없다는 것은 아닙니다. 렌더 자체가 빛을 계산해서 씬을 표현하는 방식이다 보니, 아직은 음영을 완전히 표현하기에 부족한 부분이 좀 있습니다. 물론 기술 발전의 속도가 아주 빠른 것은 사실이죠. 놀라울 정도로 3d 기술이 발전하고 있습니다.
실제 세상처럼 표현하기 위해선 계산이 많이 필요합니다. 하지만 그만큼 시간도 오래 걸리기 때문에 무한정으로 계산할 순 없습니다. 위에서 살펴본 displacement처럼 오브젝트 사이에 미세하게 작은 틈이 생기는 곳은 ao 텍스처로 강조해 주면 좋습니다.
아래 그림에서 보면, 빛을 받는 같은 공간이라고 해도 구석진 부분은 좀 더 어둡게 나타나는 경향이 있습니다. 현재는 블렌더에서 이런 ao 표현도 잘해주고 있습니다. 그런데 씬이 복잡해지고, 계산할 게 늘어나고 하다 보면, 이런 ao 표현이 만족스럽게 나오지 않는 경우도 발생합니다. 렌더 품질을 올리기 위해 무한정 렌더할 수는 없으니까요. 아무래도 실제 세상이 아닌 계산으로 만들어지는 사진이다 보니, 표현이 아쉬워지는 경우가 종종 발생할 수 있습니다.
이럴 때는 ao를 베이킹하지 않아도 바로 수정할 수 있도록 AO 노드를 따로 제공합니다.
벽 모서리가 확실히 더 어두워졌습니다. 이제 colorRamp로 조절해서 사용하시면 됩니다. 이걸 그때마다 베이킹해서 사용한다고 하면 끔찍합니다.
다시 처음 재질로 돌아와서 바닥을 살펴보겠습니다.
아마 이 나무 텍스처를 제공한 제작자의 의도는 왼쪽 그림 같은 나무 바닥을 원했던 것 같습니다. 장판이나 pvc 계열 바닥이 아닌 진짜 나무 바닥 말이죠. 거칠거칠한 나무를 직접 이어 만든 바닥이죠. 그래서 나무 사이에 AO도 강하게 표현되었습니다.
스크린샷으론 어떤지 모르겠는데, 아마 직접 만들어 씬에서 살펴보면 느낌이 조금 다를 수 있습니다.
나무 사이 홈이 주변보다는 조금 더 어두웠으면 좋겠어서 AO texture를 연결했는데, 바닥의 ao가 너무 강하지 않게 확 낮춰주었습니다.
[Tutorial #01] 06. AmbientOcclusion (AO) 연결하기 (2)
[Tutorial #01] 06. AmbientOcclusion (AO) 연결하기 (2)
01. 블렌더 PBR 기본 재질
02. 블렌더 PBR 사용하기(1)
05. AmbientOcclusion (AO) 연결하기 (1)
06. AmbientOcclusion (AO) 연결하기 (2)
'블렌더 > 블렌더 튜토리얼' 카테고리의 다른 글
[Tutorial #01] 08. 텍스처 사이즈 조절 (2) | 2024.01.13 |
---|---|
[Tutorial #01] 07. Displacement (1) | 2024.01.01 |
[Tutorial #01] 05. Ambient Occlusion (AO) 연결하기 (1) (1) | 2023.12.29 |
[Tutorial #01] 04. Normal map 적용 (1) | 2023.12.18 |
[Tutorial #01] 03. 블렌더 PBR 사용하기(2) (0) | 2023.12.18 |