[blender node] 03. Texture Coordinate node (5)
Texture coordinate
reflection
다음은 reflection 옵션에 대해 알아보겠습니다.
reflection은 반사 벡터를 표현해 줍니다.
블렌더 매뉴얼에서는 반사 벡터의 방향을 좌표로 사용하면, 반사 맵을 추가 하는 데 유용하다고 설명하고 있습니다. 그래서 환경 맵을 사용할 때 이 입력을 사용하라고 설명하고 있죠.
아래 바닥 위에 다양한 오브젝트를 만들었습니다. 오브젝트 모두에 Texture Coordinate의 reflection 좌표를 연결해 주었습니다. 이 상태에서 화면을 돌려보면, 오브젝트에 표현된 색이 실시간으로 바뀌는 걸 볼 수 있습니다.
화면을 돌릴 때 색이 바뀐다는 건, 보는 각도에 따라 좌표가 달라진다는 의미입니다.
반사는 보는 각도에 따라 달라집니다. 그래서 보는 화면에 따라 반사가 달라지죠. 그걸 좌표로 표현해 주는 겁니다.
reflection은 아래 그림처럼 반사 벡터를 표현해 줍니다. 아래 화면을 우리가 눈으로 본다고 했을 때, 오브젝트의 각 면에 반사되어 눈으로 들어오는 반사광선이 색깔로 표현되는 겁니다.
그런데 재밌는 점은, 반사되어 눈으로 들어오는 광선이 아니라, 반사되어 나가는 좌표가 표현된다는 점이죠. 이 법선 벡터가 아래처럼 x 축과 y 축을 향하기 때문에 색깔이 빨간색, 초록색으로 표현되는 겁니다.
우리는 광원에서 오브젝트를 거쳐 사람의 눈으로 들어오는 빛을 생각하는 게 자연스럽지만, (그리고 이게 실제 세상에서 발생하는 물리 현상입니다.) 렌더러는 사람의 눈에서부터 오브젝트를 거쳐 광원으로 가는 방식으로 계산합니다. 아래 그림처럼요. 빛을 역추적해서 계산하는 방식을 사용합니다.
reflection을 좌표로 삼아 벽돌 텍스처를 연결하면 아래처럼 표현됩니다.
이 상태에서 화면을 돌려보면, 이미지가 고정되어 있지 않고 화면을 따라 움직입니다. 이게 마치 거울에 벽돌이 반사된 것처럼 보이게 합니다. 심지어 roughness가 1인데도 표면이 거칠게 느껴지기보다, 정말 거울로 사물을 보는 것처럼 느껴지죠.
아래 roughness에 따른 오브젝트의 반사 차이를 볼 수 있습니다.
roughness가 0이면 표면이 매끈해져 주변 환경 광이 오브젝트에 반사되는 게 보이죠. 오른쪽 그림에서 볼 수 있듯이 오브젝트에서 정반사되는 반사광을 관찰할 수 있습니다.
그런데 roughness가 1인 표면에서도 마치 반사가 잘 일어나는 것처럼 보입니다. 거친 표면이기 때문에 실제로 명확한 정반사광이 관찰되지 않습니다. 그럼에도 texture coordinate의 좌표가 벽돌 이미지를 마치 반사되어 나오는 것처럼 표현해 줘서 거울 표면을 보는 것 같죠.
실제로 화면을 돌려보면 마치 거울반사를 보는 것 같죠.
음... 스크린샷에서는 뭔가 화면이 뚝뚝 끊기는 거 같아 별로네요. 블렌더에서 직접 해보시면 아마 더 거울처럼 보일 겁니다.
반사 벡터로 만든 좌표상에 시점에 따라 변하는 이미지를 표현하니, 마치 이 이미지가 오브젝트에서 반사된 것처럼 보이는 겁니다. 실제 화면상에서 블렌더가 자동으로 계산해 주는 반사와는 다르게, 이미지로 반사를 또 표현해 주는 거죠. 이게 reflection 좌표의 역할입니다.
그런데... 블렌더에서 사실 이 옵션은 크게 의미 없어 보이기는 하죠.
기본적으로 사이클에서는 우리가 인위적으로 반사를 만들어 주지 않아도 자체적으로 반사를 잘 표현해 줍니다. 그런데 이 texture coordinate의 reflection 옵션을 사용하면 반사를 인위적으로 조절하게 됩니다. 뭐 3d 상이라 다양한 아이디어가 실현될 수는 있지만, 현실적인 씬은 아닙니다.
사이클에서는 아래 보는 것처럼 오브젝트가 알아서 잘 반사됩니다. 빨간 동그라미를 보면 반사된 구가 잘 보입니다. 근데 벽돌 이미지가 또 반사되는 것처럼 표현해 줍니다. 특히 화면을 움직여 보면 이미지가 함께 변하면서 표면이 거울처럼 보입니다. 어떤 예술적인 장면을 원하는 게 아니라면...
아래 씬이 훨씬 자연스럽죠.
그럼, 이비에서만 쓰라고 만든 건가요? 라고 하면... 또 막상 그렇지만은 않습니다.
렌더러라는 게 꼭 실제 세상을 정확하게 구현하기 위한 시뮬레이션은 아닙니다. 현실 세상에서 빛은 무한에 가까운 상호작용을 하는데, 렌더러로 그 모든 것을 정확히 계산하기에는 시간이 너무 많이 필요합니다. 그런 건 연구용으로는 필요할지 몰라도, 실용성이 좀 떨어지죠. 그래서 실제 렌더러는 현실 세상에서 발생하는 물리 현상 중 많은 부분을 생략하거나 축소해서 장면을 만들어 냅니다.
그런데 현재는 굉장히 짧은 기간 동안 3d 기술이 발전하고 있고, 무엇보다 그래픽 카드를 비롯한 컴퓨터 자체가 급속도로 발전하면서 과거 어려웠던 계산을 해내고 있습니다. 렌더러 자체가 씬을 현실처럼 아주 정확하게 묘사해 주는 시대로 가고 있습니다.
하지만 부족한 부분이 있는 것도 사실입니다. 우리가 현실 세상의 모든 것을 3d에서 표현하지 못하는 만큼, 부족한 부분을 보충해 주기 위한 보조 기술들은 언제나 필요한 법이죠. (크게 쓸 일이 많지는 않은 거 같긴 합니다.)
아래 그림처럼 normal과 reflection을 내적하면 화면에서 보는 방향에 따라 경계를 검출할 수 있습니다. 그걸 더 강조하기 위해 컬러램프를 달았고요. 이 내적 값은 빛의 입사 각도에 따라 표면이 얼마나 밝거나 어두워지는지를 나타냅니다. 즉, 빛이 표면에 얼마나 수직으로 떨어져 있는지에 따라 표면이 얼마나 밝아지거나 어두워지는지를 결정하는 요소로 활용됩니다.
또 이걸 투명 재질에 연결해 주면, 가운데는 투명하고 오브젝트 외각으로 갈수록 두꺼워지는 물체를 표현할 수 있습니다. 기존 사이클 만으로는 표현하기 어려운 것들이 몇 가지 있는데 바로 유리나 투명 재질이 그렇습니다. 이런 것들을 더 디테일하게 표현하고 싶을 때 사용할 수 있습니다. 여기 관련해서는 나중에 투명 재질 이야기를 할 때 다시 한번 언급하도록 하겠습니다.
이번엔 이비에서 한 번 살펴보겠습니다.
이비는 기본적으로 반사를 표현하지 못합니다. 반사하는 것처럼 보여줄 뿐입니다.
이비에서 반사를 표현하려면 아래 보는 것처럼 Screen Space Reflections 옵션을 켜줘야 합니다.
그런데 이렇게 반사를 켜줘도 반사가 이상하게 표현됩니다. 노란색 동그라미 친 부분을 보면, 원뿔의 바닥이 반사되지 않는 걸 볼 수 있습니다. 그런데... 이게 맞습니다.
사이클은 빛을 추적해서 계산합니다. 그래서 아래 그림처럼 바닥에 비친 반사광이 어떤 색을 가져야 하는 지를 빛을 추적하는 과정에서 계산할 수 있습니다.
하지만 이비는 이 과정이 없습니다. 이비는 레스터라이징 기반의 렌더러로, 쉽게 말하면 화면을 스크린 샷 찍듯이 찍어서 표현한다고 생각하면 쉽습니다.
아래 그림처럼 화면을 스크린샷 찍듯이 찍어 모니터에 표현해 줍니다.
이게 무슨 기술이냐... 할지 모르겠지만, 이것도 상당히 복잡한 기술입니다. 아무것도 없는 오브젝트에 재질이 보이는 것처럼 색을 표현해 주는 게 많은 고민이 필요한 작업입니다.
하지만 이러다 보니, 화면에서 볼 수 없는 장면은 이비도 표현해 주지 못합니다. 화면에서 관찰할 수 있는 장면만 반사에서도 표현해 줄 수 있습니다.
아래 그림처럼 배경에 hdri 환경맵을 하나 설치하고, 사방이 막힌 벽을 만들어 주었습니다. 이비는 보이지 않는 벽을 반사하지 못합니다. 화면에서 벗어나면 벽을 반사하지 못해 외부에 있는 것처럼 반사가 표현됩니다. 반면 cycle은 사방에 있는 벽을 잘 반사하죠.
그래서 texture coordinate에 다른 이미지를 연결하면, 아래처럼 외부 환경맵과 다른 반사를 표현할 수 있습니다. 전혀 다른 실내맵이 반사된 것처럼 보입니다.
이처럼 이비는 빛을 추적하지 못하다 보니, 현실 세상에서 빛이 물체들과 상호작용하는 효과들을 제대로 표현하지 못합니다.
그래서 보면 옵션들이 덕지덕지 붙어 있죠. 사이클이 이런 복잡한 옵션들 없이도 자체적으로 레이트레이싱을 통해 현실 세상처럼 자연스럽게 표현한다면, 이비는 여러 방법을 사용해 데이터를 만들고 조절해서 마치 그런 것처럼 표현해 줄 필요가 있습니다. 대신 레이트레이싱이라는 계산이 없다 보니 속도는 아주 빠릅니다.
사실 실시간 렌더는 가장 중요한 빛의 물리 현상을 고려하지 않았기에 가능했죠.
여담이지만 이비도 다음 4.1 버전부터는 레이트레이싱을 지원해 준다고 합니다.
실제 초기 레이트레이싱 렌더러들도 이런 여러 가지 옵션들이 많았습니다. 점차 기술이 발전하면서 사용자가 기술을 인위적으로 조절하기보다, 렌더 자체에서 해결해 주는 방식으로 가고 있습니다. 사용자는 기술보다도 씬을 꾸미는 게 더 집중할 수 있고, 필요한 기술은 렌더러가 알아서 잘 묘사해 주는 거죠.
이비 같은 실시간 렌더러들도 이제는 빛을 추적하는 레이트레이싱 기술을 점점 지원해 주는 추세로 가고 있습니다.
조금 독특한 반사 효과를 주기 위해 이전에 만들었던 산 오브젝트에 reflection 노드를 사용해 반사를 추가해 보도록 하겠습니다.
이걸 뭐라고 표현하기 어려운데... 아래 사진처럼 물이나 얼음 표면이 빛을 반사해 반짝거리는 효과를 표현해 보려고 합니다.
햇빛을 받아 눈 표면이 반짝거리는 현상은 빛의 산란 때문에 발생합니다. 빛이 물방울이나 물결과 같은 물리적인 불규칙한 표면을 만나 사방으로 산란하면서 이러한 현상이 발생합니다. 눈이나 다른 얼음 결정이 공중에 떠다니면서 햇빛을 받으면 이러한 산란이 발생하여 반짝거리는 효과를 만들어냅니다.
이걸 texture coordinate의 reflection 노드를 활용해 보는 각도에 따라 다양한 반사가 일어나는 것처럼 할 겁니다.
아래 그림처럼 white noise 노드 하나를 만들어서 reflection 좌표에 연결해 주었습니다.
white noise는 그림에서 보는 것처럼 작은 점들을 무작위로 생성해 줍니다. 이게 refection 좌표에 연결되어 있으니, 보는 각도에 따라 noise 이미지가 달라집니다.
컬러 램프로 마스크를 조절하면, 아래 그림처럼 표현됩니다. 보는 각도에 따라 달라지는 흰점들이 생성되었습니다.
이걸 이전에 만들었던 마스크와 Darken으로 블렌딩 해 주었습니다. 그리고 역시 컬러램프로 조절해서 이미지의 흑백을 조절하면 됩니다. 그래서 흰 점들이 너무 많지 않도록 조절해 주었습니다.
이렇게 만들어진 노드가 C입니다. A와 B를 블렌딩 해 C를 만들었습니다.
그리고 A 마스크를 사용해 Emission 재질을 표현했습니다. Emission은 자체 발광하는 재질이라고 생각하시면 됩니다.
(그림이 잘못되었네요. Base color가 아닌 Emission의 컬러에 연결해 줍니다.)
기존 재질 E와 새로 만든 D 재질을 C마스크로 섞어줍니다.
그러면 화면을 돌리면 반짝거리는 눈 재질이 표현됩니다.
설명은 복잡해졌지만, 원리는 간단합니다.
Texture coordinate를 이용해 오브젝트의 높이를 이미지로 표현해 눈과 돌의 재질을 나눴습니다.
거기에 normal 좌표를 섞어 특정 방향을 표현해 줄 이미지를 또 만들었죠.
여기에 또 reflection 좌표를 사용해 보는 화면에 따라 바뀌는 이미지를 표현해서 섞어주는 겁니다.
노드를 응용해 이미지를 만들고, 이미지를 블렌딩하고, 이렇게 만들어진 이미지를 오브젝트에 표현해 나갑니다.
재질을 섞고 만드는 걸 너무 복잡하게 생각하면 어려운 작업이 됩니다. 그래서 이 과정들을 이미지로 표현하고 생각하는 게 중요합니다.
그리고 마지막으로 솔직히 이야기하자면... reflection 좌표 글을 쓰기 전부터 이 예시를 소개할지 말지 고민하기는 했습니다. 그도 그럴 것이 블렌더에서 이런 식으로 반짝이는 효과를 만드는 건 개인적으로 추천하지 않습니다.
여러 가지 상황들을 이미지로 생각해서 더하고, 빼고 다양하게 섞어서 사용할 수 있다는 걸 말하고 싶었습니다. 비록 그게 변하는 이미지라고 해도요. 저런 효과들은 파티클을 사용해서 만들던지, 아니면 애프터이펙터 같은 프로그램으로 작업 후반에 따로 합성하는 걸 추천드립니다.
[blender node] 03. Texture Coordinate node (5)
[blender node] 03. Texture Coordinate node (5) - 연결된 글입니다.
03. Texture Coordinate node (1)
03. Texture Coordinate node (2)
03. Texture Coordinate node (3)
03. Texture Coordinate node (4)
03. Texture Coordinate node (5)
03. Texture Coordinate node (6)
'블렌더 > 쉐이더' 카테고리의 다른 글
[blender node] 03. Texture Coordinate node (6) (0) | 2024.01.09 |
---|---|
[blender node] 03. Texture Coordinate node (4) (1) | 2024.01.05 |
[blender node] 03. Texture Coordinate node (3) (1) | 2024.01.04 |
[blender node] 03. Texture Coordinate node (2) (1) | 2024.01.03 |
[blender node] 03. Texture Coordinate node (1) (1) | 2024.01.02 |