-고층 건물 외벽 만들기- 


대도시 빌딩숲에서 많이 볼 수 있는 건물 외벽이 '유리'다. 고층건물이 밀집한 지역의 빌딩들은 대부분 큰 유리가 외벽의 80%를 차지한다. CG에서는 액션영화의 폭발하는 건물씬에서 유리외벽 쉐이딩을 사용한다. 이번 포스팅에서는 대도시 빌딩숲을 표현할 유리외벽 쉐이딩을 알아보자.

1 『 카메라 세팅 』

박스 폴리곤들을 생성해서, 멀리 있는 빌딩이 보이는 것처럼 카메라 샷을 설정한다.


2 Layered 쉐이더 노드 생성 

빌딩은 창문과 외벽 그리고 창문틀이란 각각 다른 쉐이더들의 집합체이다. 따라서 기존 벽돌 쉐이더나 아스팔트와 달리 Layered Texture가 아닌 Layered shader가 필요하다. 아래 이미지처럼 layered shader 노드를 생성한다.


3 창문 쉐이더 노드

고층 건물의 창문을 멀리서 보면, 투명하지 않다. 창문이라 해서 모두 같은 창문이 아니다.  고층건물의 유리 쉐이더는 transmission값을 제로세팅하고, roughness값을 조절해서 잘 코팅된 반사유리 재질로 만들어야 한다. 


3-1 ai Noise 노드 생성

빌딩 전체 유리모습에 그라디언트가 들어가야 한다. ai Noise노드를 생성하고, 포토샵에서 가우시안 blur를 사용한 이미지처럼 만든다. (아래사진 참조)


3-2 setRange 노드 생성

ai Noise 노드값을 그대로 쉐이더에 적용하면, 엄청난 명암대비가 나타날 것이다. 이를 자유자재로 조절할 수 있는 setRange노드를 aiNoise노드와 연결하여 수치값을 줄여준다. (아래 사진 참조) 


3-3 aiStandardSurface 노드 생성

setRange노드를 거쳐 순화된(?)값을 aiStandardSurface 노드의 color값으로 넣어준다. 고층건물의 유리재질 느낌은 아래 사진의 값을 참조한다.


3-4 그리드 노드 생성

grid 노드를 2개 생성한다. 수백개의 창문이 있는 모습을 연출하려면, 가로곡선만 있는 그리드와 세로곡선만 있는 그리드를 plusMinusAverage노드로 합성한 알파맵을 사용해야 한다.


일단 grid노드를 생성한 후, 하나는 width값을 '0'으로 놓고, 나머지 하나는 height값을 '0'으로 설정한다. (가로 전용, 세로 전용)


grid노드의 place2dTexture노드의 repeat값을 아래처럼 적용한다. (각 폴리곤 uv크기에 따라 다르니만큼 각자 랜더링을 하면서 맞춰준다) 해당 프로젝트에서는 grid 가로세로 repeat값을 아래와 같이 설정한다.


test랜더링을 했을 때, 아래와 같이 나온다면, grid repeat값을 확 늘려야 한다. 


grid의 place2dTexture repeat값을 확 늘려서 아래와 같은 비율을 만들어준다. 


grid에서 흰색은 포토샵이나 에펙의 마스크의 흰색이라 생각하면 된다. 흰색은 컴퓨터가 '1'로 인식하고, 검은색은 '0'으로 인식한다. 따라서 수치값이 '0'인 검은색 부분은 투명값이 되어서 합성이 되는 영역이 된다. 반대로 흰색부분은 마스킹이 되어 아무런 값이 들어갈 수 없다. 


가로와 세로를 곱한 격자무늬 그리드의 검정색 부분에만 창문 쉐이더가 합성되면, 아래와 같은 이미지가 생성된다. 창문쉐이더의 color값을 하늘색으로 변경해준다.


빌딩의 윗부분(옥상)은 시멘트로 마무리되는 경우가 많다. 윗부분까지 창문이 침범하지 않도록 흰색 마스킹을 ramp노드로 만들고, 기존 그리드 노드가 연결된 plusMinusAverage노드와 연결한다.  


4 창문틀 만들기

창문 만들기와 거의 흡사하다. 


4-1 grid 노드 2개 생성

창문 grid의 width값이 0.12였다면, 창문틀은 0.12보다는 작아야한다. 0.12보다 작아야만 검은색 범위가 넓어지면서 해당부위가 창틀이 된다.


4-2 grid노드의 place2dTexture, connectAttr MEL스크립트로 연결

place2dTexture[].outUvFilterSize와 grid노드의 uvFilterSize를 연결한다. (벽돌쉐이딩 포스팅 참조)


4-3 plusMinusAverage노드 연결하기

plusMinusAverage노드에 3개의 알파노드(창문틀 grid2개+빌딩상단부분 마스킹 램프노드)를 연결하고, Layered shading의 input2 transparent에 연결한다. 외벽 쉐이딩 노드는 아래와 같이 빨간색으로 만들어서 Layered shading의 input2 color값에 연결한다. (테스트용으로 빨간색 사용) 


빨간색으로 창문틀이 제대로 구현이 된다면, 아래처럼 진한 회색의 창문틀 색으로 변경한다. 


4 『 건물 상층부 만들기

램프 노드를 생성하여 다음과 같은 알파맵을 만든다. 


위의 이미지를 보면, u램프와 v램프를 multiply-divide노드로 합성하여 만들어진 검정색 직사각형 알파맵을 볼 수 있다. 


5 Layered Shading노드 연결

u,v램프의 합성으로 만들어진 알파맵을 transparent에 연결하고, 창문 쉐이딩 노드를 칼라값에 연결한다. 


6 빌딩 외벽 쉐이딩 연결

Layered shading노드의 마지막 쉐이더로는 램버트 느낌의 회색빛깔 쉐이더를 연결한다. Layered 쉐이딩 노드에 연결된 쉐이더를 정리하면, 아래와 같다. 순서대로 창문을 먼저 연결(마스킹)하고, 그 위에 창문틀을 덮어쓰고(마스킹), 빌딩상단 데코레이션 부분(마스킹)을 덮어쓰고, 마스킹 된 나머지 부분을 외벽 쉐이더가 덮어쓴다.  


grid노드를 따로 랜더링해서 범프맵을 만들고, 범프를 씌우면 훨씬 실사에 가까워진다. 해당 프로젝트에서는 범프맵까지 씌우지는 않았지만 실제 랜더링을 한다면, grid노드를 범프맵으로 만들어서 사용해보자. 건물외벽 쉐이더에는 solid fractal이나 ai noise노드를 알파맵으로 연결해서 사용하면, 훨씬 실사감을 높일 수 있다.