Featured image of post SSS 쉐이더 만들었어요 뿌우

SSS 쉐이더 만들었어요 뿌우

SSS (Subsurface Scattering : 표면하산란(表面下散乱)) 이란, 피부와 같은 재질에서 피부 안쪽의 재질이나 색깔이 밖으로 비쳐보이게 되는 현상을 의미합니다. 사실 굉장히 복잡다난한 규칙이지요.

우리 피부는 사실 완전히 불투명하지 않습니다, 사알짝 반투명하지요. 그래서 핏줄이 보이는거고, 혈색이 도는 거지요.
빛은 우리 피부에서 일부는 반사되고 일부는 통과되며, 일부는 피부 안의 조직등에 반사, 흡수되는등 다양한 조작이 일어나게 됩니다.


출처 : https://graphics.stanford.edu/wikis/cs348b-08/ihkfinal

때문에 우리 피부는 살짝 반투명하며, 그것은 특히 빛을 등지고 있을 때 선명하게 나타나곤 합니다.
이것이 살아 있는 피부와 마네킹의 차이이며, 컴퓨터 그래픽스에서도 이것을 표현하기 위해 많은 노력을 해 왔었습니다.



극단적으로 얘기하면, 저 위의 귤과 소 모형의 차이라고 할 수 있을 것입니다.
귤은 빛이 투과되고 산란된 반면, 소는 빛에 의해 어떠한 투과현상도 일어나지 않았습니다.

http://gurneyjourney.blogspot.com/2008/05/subsurface-scattering.html

컴퓨터 그래픽스에서는 이미 이런 표현을 위해 많은 논문들이 발표되어 왔었습니다.

이미 몇 년 전에 NVIDIA에서 발표된 “Human Head Demo” 는 이 효과를 극대화해서 리얼한 사람 피부를 리얼타임으로 구현해 내는데 성공했습니다. 8800 Ultra에서 돌아가는 이 피부 효과를 슬쩍 본 적이 있는데, 생각보다 많은 기법이 들어가 있었습니다.
대표적인 기법이라면 역시 텍스쳐 레이어 …
피부의 깊이감 효과를 위해서 레이어 텍스쳐를 여러 장 만들어 블러시켜서 덧붙인다던가 ,
또는 빛이 들어오는 경계선 부분의 RGB를 산란시켜 SSS 느낌이 나오게 한다던가 등의 수준높은 기술들이 구현되었지요.
(자세히 안봤습니다 . 슬쩍 봤다니까요 ㅋ)

하지만 최근 MMO에서는 이정도까지 쓰는건 솔직히 좀 무리 … 가 있지요.
때문에 대부분의 게임에서는 Fake SSS 로 , 비슷하게 구현을 하도록 하였습니다.

마비노기 영웅전 같은 경우에서는 Diffuse 의 색상이 어둡게 되는 경계선 부분에 붉은 색을 칠해주는 방식을 사용했었습니다.
http://codevania.springnote.com/pages/3418155.xhtml
에서 소개한 방식과 같지요.
GPU Gem 에서도 소개된 방법입니다.
http://http.developer.nvidia.com/GPUGems/gpugems_ch16.html
WrapLighting.jpg
이것은 일종의 warp lighting 계열로도 표현할 수 있는 방식입니다.

언리얼에서 이번에 발표한 데모 ‘사마리아인’ 에서는 좀 더 수준높은 SSS가 구현되었습니다.
유명한 그래픽 칼럼리스트 니시카와 젠지는
“이것은 통상의 거울반사 모델과 확산반사 모델을 조합한 통상의 라이팅을 한 결과와 그것을 색변조규칙(色変調規則)을 기준으로 화면좌표계(画面座標系)로 blur 시킨 것을 합성하여 구현하고 있다. 색변조규칙이란 한 점을 빛이 투사했을 때 그 빛이 피부에 침투, 확산하여 색이 변한 뒤(주로 빨간 경향을 띈다) 재차 출사(出射)한 측정결과에 근거한다”
이라고 설명했었지요.

테라에서는 정확히는 알 수 없지만 일단 기술강연에서는 ‘전체적으로 피부 부분에만 붉은색을 추가했다’ 라고만 발표했지요.
어쨌거나 굉장히 값싸게 표현했다는 것은 알 수 있습니다.

뭐 그래서 저희는 어쩌지… 라는 고민끝에,

  • 기본적으로는 에미시브가 아닌 라이팅에서 적색 (혹은 지정된 색) 라인 추가
  • 마스킹에서 텍스쳐를 사용해서 데이터를 낭비하고 싶지 않기 때문에, 붉은 색의 vertex color를 마스킹으로 이용. 당연하게도 붉은 색이 연하면 SSS도 연하게 적용된다.
  • 동시에 여자 캐릭터 (혹은 요정류) 를 위한 half-rambert 조절자 추가. 역시 이것도 vertex color로 마스킹됨.
  • 그냥 붉은 색만 추가하는 것만으로는 빛 투과 효과가 나오지 않기 때문에 Translucent 기능도 추가되어야 함.
  • 이 모든 것은 최저 데이터와 가벼운 계산을 목표로 함

정도로 정하게 되었습니다.

일단, 계산양을 줄이고 싶었기 때문에 SSS 도 복잡한 함수를 사용하지 않고,
기본으로 계산된 빛 계산 공식인 Lambert의 값을 그냥 사용하고 싶었습니다.
이것은 어셋 스토어에서 25$나 주고 결재한 쉐이더 세트를 분석해서 도움을 받았지요 ㅋ

일단 그냥 Lambert

이 값을 뒤집고 Pow (쉐이더에서의 파워는 X^Y 를 의미합니다) 와 Multi로 강하게 만들고 다시 색을 넣어서 SSS 기본 완성.
다시 이걸 Lambert와 곱해서 SSS 구현.

짠.

간단합니다. 때문에 Lambert 의 계산값이 바뀌면 SSS에도 영향이 좀 갑니다만, 익숙해지면 그러려니 할 수 있는 레벨입니다.

pow 값은 넓이를 조절하고,
multi값은 강도를 조절합니다.

여기에 또 하나 추가된 기능은 Half Lambert.
하프 라이프2 에서 사용되고 발표된 , 대인배 밸브횽아가 발표한 새로운 렘버트 방식으로, 이걸 사용하면 빛이 부드럽게 넘어가는걸 아주 간단하게 구현할 수 있어서 여자 캐릭터한테 좋습니다. 단 노말 같은게 좀 평평해지는게 단점.

그래서 이걸 조절할 수 있게 만들었지요.
이렇게 조절됩니다.

적절하게 이용하면 Translucent 기능까지 흉내낼 수 있지요.


좀 더 반투명한 느낌이 나게 할 수 있습니다.

그리고 이것은 피부와 같은 재질 전용이기 때문에, 마스킹이 필요한데요.
이것은 vertex color로 처리하였습니다. 텍스쳐 용량을 늘이지 않기 위해서요.

일단 검은색으로 바꾸고, 피부인 부분만 붉은색으로 올려주면 됩니다.
연한 붉은색으로 하면 연하게 먹지요. 피부가 투명하면 진한 붉은 색으로, 조금 불투명한 부분은 연한 붉은 색으로 섬세하게 조절할 수 있게 해 놓았습니다.


그럼 이렇게 적용됩니다.

아직 역광 상태일때 더 빛나는 Translucent 기능은 제작되지 않았습니다. 이건 조금 지켜보고 추가하려구요.

어쨌건 이걸 적용하면 이렇게 됩니다.

어허허허허. 엇 아니 이건 실수.
그렇다고 프로젝트를 다 보여드릴 수도 없으니 ㅋㅋㅋ (아직 비밀 프로젝트!)
사내게시판에는 다 올라갔지만요.
뭐 그래서 코만 일부분을 …

이랬던 코가

이렇게 됩니다. 쬐끔 쎄게 해봤음 자랑하느라.

이 아저씨도


저희 제품을 이용하시면 마치 20대같은 투명하고 탱탱한 피부를 얻으실 수 있게 된답니다.
뉴칼레도니아 센서티브 모이스쳐라이징 센서티브 딥클린 페이셜 포밍 클린징 크림

이렇게 강하게 생긴 아저씨는 half lambert 수치를 줄이는 것이 좋습니다.
half lambert는 너무 주면 노말맵의 효과가 깎이는 단점이 있거든요.

앞으로 추가할 것은 빛이 반대방향에 있을 때, 귀나 손같이 얇은 피부는 빛이 와방 투과가 되어서 빛나는 효과를 넣고 싶은데요.
요것도 그렇게 무거운 계산은 필요없어요 . 잔재주 피우느라 머리가 아파서 문제지.

lizard_0_3.jpg

http://www.zbrushcentral.com/showthread.php?21774-creature-bust&p=177760

대충 뭐 요런 거 말이죠.

하지만 뭐 일단 요걸로 끝…

Hugo로 만듦
JimmyStack 테마 사용 중