SSS 쉐이더 만들었어요 뿌우 by 김윤정

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

대충 뭐 요런 거 말이죠.

하지만 뭐 일단 요걸로 끝...


핑백

  • 대충 살아가는 게임개발자 : 2011년 내 이글루 결산 2012-01-02 14:23:24 #

    ... SSS 쉐이더 만들었어요 뿌우</a> 2위: 3d(16회) | 삼성에서 주최한 3D TV 비교 시연회를 갔... 3위: 유니티(15회) | <a style="COLOR: rgb(153,153,153)" href="http://chulin28ho.egloos.com/5591833" target="_new">SSS 쉐이더 만들었어요 뿌우 ... more

덧글

  • 스쿨리트 2011/10/19 10:42 #

    아 정말 많이 배웁니다.
  • 김윤정 2011/10/19 17:54 #

    아니 뭐 100% 믿지는 마세요. 제 지식 수준이야 뻔 ... ㅋㅋㅋ
  • 꾸엠 2011/10/19 16:26 #

    흐규 윤정님 멋있어요 ㅠㅠ/~
  • 김윤정 2011/10/19 17:54 #

    에엑 난 꾸엠님 부러워 샘나 돌아가시겠음 (바둥바둥)
  • 꾸엠 2011/10/19 23:53 #

    저는 윤정님같은 멋진 개발자가 되고싶어요 ㅋㅋ 하앜
  • 김윤정 2011/10/20 07:52 #

    저는 커서 꾸엠님같은 미소녀가 되고 싶어요 항가항가 (헉 .... )
  • Xeon 2011/10/19 21:58 #

    컴퓨터그래픽스 때 저런 거 배운 기억이 나네요... 어렴풋이...
    하지만 워낙 내용이 어려워서 때려친...ㅠ_ㅠ
  • 김윤정 2011/10/19 22:58 #

    오 배우셨다니 부럽부럽.
    독학의 깊이는 얕아요.. OTL
  • 자무 2011/10/20 08:31 #

    와~ 게임 쉐이더의 세계는 무궁무진!
    유니티 배우고 싶어요 ㅠㅠ
  • 김윤정 2011/10/20 09:03 #

    재밌졍 - ♥
  • 오즈라엘 2011/10/20 10:44 #

    우와 김윤정 올마이티
  • 김윤정 2011/10/20 12:55 #

    흐규흐규 자르지만 말아주세여 ㅠㅠ
  • 11호 2011/10/22 12:39 #

    조금 더 크게 실수해주시지... 코만 보니 현기증이 ㅋㅋㅋ
  • 김윤정 2011/10/23 10:34 #

    앙대여 저 짤려여 ㅋㅋㅋ
  • 2011/10/27 11:16 # 비공개

    비공개 덧글입니다.
  • 김윤정 2011/10/27 12:24 #

    그러시군요! 답글은 블로그에 ..
  • 2011/10/27 19:02 # 비공개

    비공개 덧글입니다.
  • 김윤정 2011/10/27 22:50 #

    에헷
  • 이랑 2011/11/01 12:05 #

    우아~ 오늘도 잘 배우고 갑니다^ㅁ^ 궁금한게 있는데 유니티엔진을 사용하지는 않지만 어셋스토어에서 쉐이더를 구입해 공부해서 다른 엔진에 적용하기에 괜찮은가요?
  • 김윤정 2011/11/01 14:30 #

    아뇨 바로는 사용하기 힘듭니다. 뜯어보고 응용해서 다른 엔진에서 다시 짜면 되니까 그렇게 어려운건 아니지만, 어쨌건 바로 가져가는건 좀 곤란합니다. 자체 문법도 좀 있고 해서 말이죠.
  • 라고 2011/11/15 12:27 #

    제품명에 센서티브가 두번 들어갔어요 ㅋㅋ
    sss뜻은 알았지만 이렇게 보니 정말 신기한 기술인것 같네요 ㅎㅎ
  • 김윤정 2011/11/15 13:46 #

    ㅋㅋ 나중에 봤는데 그냥 의도 됐다고 우기는 중
  • mizigun 2011/11/25 14:20 #

    야외에서 그림을 많이 그리는 친구들이 피부묘사에 있어 색상을 풍부하게 쓰는 경향이 있는데 역시 아트의 표현에는 그리는 도구와 방식의 차이 뿐이군요..ㅠ.ㅠ
  • 김윤정 2011/11/25 15:13 #

    흐흐 네에. 요샌 코딩으로 그림그리는 기분입니다.
  • 독코끼리 2012/01/06 12:18 #

    잘 배우고 갑니다^^b
  • 김윤정 2012/01/08 09:40 #

    감사합니당 :)
※ 로그인 사용자만 덧글을 남길 수 있습니다.


MyADD

<script> (adsbygoogle = window.adsbygoogle || []).push({}); </script>