회사에서 현재 사용 중인 블렌더용 셰이더입니다.
국내 블렌더 NPR(Non Photo-realistic Render)참고 자료가 얼마 없고, 저 역시 배움에 어려움이 많았기에 NPR을 공부하시는 분들께 도움이 되고자 스스로 만든 셰이더를 공유합니다.
이브이 렌더러 전용입니다.
이 셰이더는 실무에서 사용 중인 레벨이지만, 그렇게 복잡하지는 않습니다.
내부는 총 12개의 조절부로 구성되어 있으며, 각 정보는 함수로 흘러들어가 적절히 처리됩니다.
1~8은 설정값에 관련된 것들이고, 9~12는 사용할 텍스처에 관련된 것들입니다.
텍스처
텍스처에 대한 이해가 있어야 설정값들이 의미를 가지기 때문에, 텍스처에 대해 먼저 설명하겠습니다.
셰이더는 총 4장의 텍스처로 구성됩니다.
- 컬러맵
- MSE맵
- RSS맵
- Matcap맵
쉬운 것부터 보죠.
컬러맵
우리가 잘 아는 Color맵입니다. Albedo라고도 하고 Diffuse라고도 합니다.
UV좌표대로 표면의 색을 칠해주는 역할을 맡고 있습니다. 이 맵은 필수이며, 없으면 모델이 검게 표현됩니다.
Matcap맵
은 철재질을 표현할 때 리플렉션맵 대용으로 사용하며, 때때로 앤젤링(머리카락 하이라이트)을 대신하기도 합니다. 거의 모든 모델에 공용으로 사용하며 원할 경우 바꿀 수 있게 설계했습니다. Matcap에 대해 잘 모르신다면 그냥 제공되는 맵을 사용해도 무방합니다.
MSE, RSS맵은 퀄리티 업을 위해 필요한 맵들입니다. 없어도 돌아가긴 합니다.
이 맵들이 알록달록 알 수 없는 색깔을 띄는 이유는, 텍스처 한 장에 각각 3개의 정보를 담고 있기 때문입니다. 이러한 류의 맵들을 마스크맵이라고 하는데, 이런 마스크맵들은 컬러스페이스를 Linear로 설정해주어야 보다 정확한 정보를 얻을 수 있습니다.
마스크맵의 기본 규칙은 흰색부분만 출력되며, 얼마나 하얗냐에 따라 적용되는 강도 또한 달라진다는 것입니다.
MSE맵
Matcap, Shadow, Emissive 세 가지 정보를 담고 있는 마스크맵입니다.
Matcap
위에서 기술한, Matcap텍스처가 표시될 영역을 지정해주는 마스크맵입니다.
흰색부분은 반들거리고, 나머지는 그냥 기존과 같게 됩니다.
맷캡은 캐릭터당 한가지 모양밖에 사용할 수 없습니다. 만약 캐릭터가 지팡이가 아니라 소총같이 가로로 길다란 물건을 사용한다면, 맷캡의 모양은 세로줄보다는 가로줄 무늬가 나을 수도 있습니다. 이 때는 포토샵등에서 이미지를 90도를 돌려사용해 보세요
하나 더 주의할 점은, 맷캡의 표현이 평면과 궁합이 좋지 않다는 사실입니다. 때문에 맷캡은 조금이라도 곡면을 가진 물체에만 사용하는 편이 좋습니다. 평면에 맷캡의 이미지가 잘 투영되지 않는 것은 정상적인 현상이므로 당황하지 않기를 바랍니다.
Shadow
명암이 질 때 추가로 명암이 질 영역을 설정해 줍니다. 툰렌더의 핵심이죠. 여기에 그려진 영역은 명암이 질 때 자연스레 덩어리 명암과 섞이게 됩니다. 마스크맵 중 가장 다루기가 힘든 맵이며, 최종 퀄리티에 가장 큰 영향을 끼치는 되는 맵이기도 합니다. 허리부분의 옷주름을 보면 그 효과를 알 수 있습니다.
Emissive
빛나는 부분을 지정해 줍니다.
이 부분의 컬러는 이미시브 컬러노드에서 별도로 제어됩니다.
현재는 하나의 셰이더에 하나의 색깔만 지정할 수 있습니다.
컬러는 충분히 밝게 빛나도록 설계되었기 때문에, 너무 밝은 경우 명암을 조금 줄여주시길 바랍니다.
RSS맵
Rimlight, Specular, Skin의 세 가지 정보를 담고 있는 마스크맵입니다.
Rimlight
캐릭터 외곽을 따라 실루엣을 강조해주는 림라이트를 설정합니다.
샘플에서는 모든 부분을 흰색으로 칠해놓았고, 실제로 이렇게 사용하는 경우가 많긴 합니다만, 때때로 림이 너무 넓은 면적에 걸쳐 그려질 경우 캐릭터가 떠보일 때가 있습니다. 이럴 때 해당부분을 검은색으로 눌러주어 림라이트가 적용되지 않도록 합니다.
현재는 림라이트를 더 강하게 할 수는 없습니다. 실제로 3점 조명등에서 림을 아주 쎄게 주어 분위기를 살리는 경우가 있지만, 셀프쉐도우의 계산을 넣지 않은 림라이트는 그냥 유령처럼 보일 뿐이라 일부러 조절부를 뺐습니다.
Specular
맷캡만으로 반짝거림이 충분하지 않을 경우나, 완전히 밝은 흰색이 하이라이트로 표현되어야 할 경우가 있습니다. 혹은 앤젤링을 아주 강하게 표현해야 할 때가 있을지도 모릅니다. 흰색이 강할 수록 스펙큘라도 강하게 표현됩니다.
실시간 렌더링에서 주로 사용되는 블린-퐁방식을 조금 변형했습니다. 툰렌더에서는 어차피 자세한 표현이 필요없기 때문에 무거운 제곱연산을 버리고, 임계치로 흰색과 아닌 부분을 짤라낸 방식을 사용했습니다.
스펙큘라는 설정값이 많습니다. 8개의 설정값 중 무려 3개가 스펙큘라와 관련된 것들입니다.
- 스펙큘라 범위 (0 ~ 0.4) : 하이라이트가 얼마나 넓게 퍼질 것인가를 결정합니다. 수치가 높을 수록 영역이 좁아집니다.
- 스펙큘라 각도올림 : 블린-퐁방식만으로는 원하는 느낌을 얻기 힘들어서 인위적으로 스펙큘라의 높낮이를 조절할 수 있도록 설정했습니다. 이는 자연 법칙에는 어긋나지만, 보기 좋은 이미지를 얻기에는 도움이 됩니다.
- 스펙큘라 컬러 : 말그대로 색깔을 변경할 수 있는 노드입니다.
Skin
이름만 보고 오해하실까봐 말씀드리자면, SSS같은 거창한 건 아닙니다. 스킨 마스크는 단지 해당영역의 그림자의 색깔을 조절해줄 뿐입니다. 하지만 NPR에선 피부의 색깔이 매우 큰 영향을 끼치기 때문에, 마스크 채널 하나를 할당할만 하죠.
스킨 마스크의 앰비언트 컬러는 피부명암 컬러 노드에서 조절할 수 있습니다.
스킨 마스크로 설정된 부분은 '피부명암컬러'의 그림자색을 사용하게 되며, 나머지영역은 기본명암컬러를 사용합니다. 이 영역을 회색으로 설정하면 두가지 색이 반반 섞인 색깔을 사용하게 됩니다. 예제의 경우, 보라색이 되겠죠.
그외에도 명암을 좀 붉게 드리우고 싶은 부분에 사용할 수 있습니다. 예제에서는 옷소매의 별무늬에 사용됐습니다.
사실 스킨마스크의 첫계획은 명암 컬러맵을 따로 쓰는 방안이었습니다. 유니티짱처럼 말이죠. 이 쪽이 아티스트에게 좀 더 자유를 줄 수 있지만, 웬걸... 작업해보니 두번째 컬러맵을 만드는 게 너무너무 귀찮은 게 아니겠습니까...어차피 초록색 명암 쓰는 경우는 거의 없고, 피부=빨강, 나머지=파랑의 그림이 대부분이니 초록명암은 과감히 무시하고 편의성을 취했습니다. 결과는 아직까진 괜찮습니다.
빛방향
말그대로 빛의 방향을 결정합니다. 사용법은 그냥 구를 잡고 이리저리 돌리면 됩니다.
라이트의 방향을 받아오는 방식이 조금 번잡시러운 감도 있고, 얼굴과 몸은 명암의 강도가 다른 쪽이 예뻐보였기 때문에,그냥 셰이더 내부에서 벡터를 받아오도록 처리했습니다.
명암 부드럽기
말그대로 명암의 부드러운 정도를 결정합니다. 기본값은 0.05이며, 0을 넣게 되면 고장납니다. 최소 0.001부터 사용해 주세요.
셰이더 변환기(Shader Switcher)
실제로 작업을 할 때, 컬러맵을 칠하기 위해선 툰 셰이딩이 방해가 될 때가 있습니다. 정확한 색깔을 볼 수가 없기 때문이죠. 이럴 땐 빛을 받지 않는 언릿 셰이더가 더 낫습니다.
예제 블렌더 파일 내부의 스크립팅 탭에 셰이더 변환기 코드가 들어있습니다.
이를 실행하면 툰렌더와 언릿을 오가는 셰이더 변환기를 설치합니다. 뷰포트의 오른쪽 탭에서 IX_NPR탭을 찾을 수 있습니다.
스위처의 선 굵기 옵션은 툰 셰이딩 시에 선을 얼마나 굵게 사용할 것인지에 대한 설정입니다. 숫자가 높을 수록 선이 굵어집니다. 실시간으로 적용되는 것은 아니므로, 설정 후엔 언릿 셰이딩으로 갔다가, 다시 툰셰이딩으로 돌아와 주어야 적용됩니다.
얼굴 윤곽선은 현재 그리지 않도록 설정되어 있습니다. 이는 오브젝트 이름을 따릅니다. 오브젝트의 이름이 'Face'혹은 '얼굴'로 설정되어 있다면, 윤곽선을 그리지 않습니다.
원한다면 체크박스를 설정하여 이걸 그릴 수도 있습니다만 ...예쁘지 않아요. 한 번 해 보세요.
이 셰이더로 실제로 작업을 할 땐 예제 모델을 지우고 이 블렌더 파일에서 작업을 시작하시는 걸 권장합니다. 필요한 셰이더와 지오메트리 노드, 스크립트를 모두 넣어놨기 때문이예요. Append로는 가져올 게 너무 많을 것 같아요.
셰이더를 개량 / 배포하실 땐 출처를 밝혀주십시오. 그 외엔 자유롭게 사용하세요.
이것이 당신의 공부에 도움이 됐으면 좋겠습니다.