블로그 이미지
자신의 단점을 메꾸는 것을 단(鍛)이라 하고 자신의 강점을 갈고 닦는 것을 련(鍊)이라 하여, 두가지를 합친 것을 단련이라고 부른다. 붕대마음

카테고리

전체목록 (667)
참고사이트 (8)
Goal (4)
Travel (10)
My Life (105)
Game (35)
Game Review (7)
Game Plan (0)
Books (5)
English (1)
Optimizing (12)
Study (218)
유용한 것들_etc (44)
유용한 것들_func (20)
Unity (48)
Unreal (87)
작업장 (54)
RenderMonkey (6)
정리요망 (1)
따라잡기 시리즈 (0)
링크용 (0)
Total344,974
Today26
Yesterday53
links
- 피부는 왜 피부처럼 보이는가? 1 : http://mgun.tistory.com/1545
- 피부는 왜 피부처럼 보이는가? 2 : 
http://mgun.tistory.com/1557 


복잡해 지는 과정으로 넘어가기 전에 여태까지온 길을 되짚어 보자.

피부를 표현하기 위한 노력. 
1. 단순히 피부색의 텍스처를 붙여 확산반사 라이팅을 한다.
   (값싼 방법이지만 플라스틱처럼 보인다.)


2. Half Lambert Lighting
   (물리적으로는 맞지 않지만 부드러운 음영이 나온다.)

평준화.

pow 연산.
     
3. Half Lambert Lighting + Phong Specular Lighting. 
   (하프라이프2 에피소드1에서 사용. N과 L 이외에 E방향도 고려.
    피부에 한결같이 specular을 적용하면 금속처럼 보이므로 어느 위치에 어느만큼의
    specular을 적용할 지를 정하기 위해 Specular Exponent, Specular Mask 사용)


    4. KS BRDF (지방질층의 반사)
       면의 거친정도, 굴절률등을 고려한 반사공식.

면의 거친정도, 굴절률등을 고려.

5. KS BRDF + 프레넬 + 확산반사 * 화상텍스처. 

약간 건조한 느낌이 난다.
하프라이프2의 스킨셰이더와 거의 흡사하다.


6. 다중 레이어.
피부의 광산란은 단층이 아닌 복수층.
단일 레이어 스킨 모델은 밀랍처럼 보인다.
표피는 좁은 산란, 아래쪽 레이어는 넓은 산란 대부분 붉은 계통.

 
흐음..대략 이러한 수순을 밟는다.

이제 다시 진도를 나가보자.
이 다중 레이어를 만들기 위해서는 어떻게 해야하는가?
- 입사광으로 시작
- 표면의 블러
- 블러 추가
- 선형 조합
 
평평하고 높은 산란 표면의 어느 점에 좁게 집중되어 입사한 빛을 생각 해 보자.

 
음영처리를 하는 것은 해당 폴리곤 상의 픽셀이며, 어느점에 입사 한 빛이,
그 주변에 대해 어떤 확산광이 되어 돌아오는지를 알아야 한다.
아래 그림을 보면 입사광이 내부에서 산란을 거친 후 다시 확산이 일어나는것을 볼 수 있다.
여기에 집중되어 들어오는 빛은 거의 수직으로 들어오는 빛이라고 생각해도 될듯...
일단 여기서는 표면의 미세면 거친정도는 고려하지 않는다.

 

결국 필요한 정보는 광선이 피부를 조사할 때 그 조사점으로부터의 반경 r에서는
산란을 거친 후 어떤 색의 빛이 어느 정도의 밝기가 되는지 이다.

 
우리는 이러한 정보(피부에 비춘 한개의 광선이 피부 밑에서 어떻게 산란해서 나오는지)를
계산할 수 있다.

위 그림은 실제로 계측하는 모습이다.
방향을 고려하지 않고 전방위로 같은 결과를 얻을 수 있다고 가정하기 때문에
계측기는 일차원 모양의 센서로 되어있다.


위 그림은 확산 프로파일(RDP:Reflectance Diffusion Profile)을 그래프화 한 것이다.
세로축이 반사율, 가로축이 빛이 조사한 위치로부터의 거리이다.
즉, 멀리가면 갈수록 빨간색이 강하게 남는것을 알 수 있다.
여기에서는 특히 RGB에서의 반경과 반사율의 관계는 완전히 다르다.

위 이미지는 반사율 확산 프로파일을 이차원 평면상에 가시화 한 것이다.

다시 정리를....



산란에 대한 핵심 아이디어로는
- 모든 표면 점에서 입사광(color 값)을 모으고 확산을 근사화(방향을 무시한 합),
   이웃 표면지점 내에서의 산란.
- 2d 평평한 표면의 각 지점에서
  초기의 라이트를 모아서 이웃 픽셀들 내에서 산란,  
  r로 분리된 것에 의존.

  이는 블러와 같다.


즉, 표피상의 모든 픽셀이 이 ROP에 따라 피하산란을 하고 돌아온다고 가정하면
복잡한 피하산란을 이것으로 간이적으로 구현할 수 있지 않을까?

이 조건으로한다면 피하산란은 모든 표피픽셀에 대해 ROP를 참고해 블러하면된다.

사실 표피면에 수직으로 들어가는 빛이라는 것은 엄밀하게 구할수는 없지만 대부분은
지방질층을 빠져나온 확산광이라고 할 수 있다.

이것은 결국 확산반사의 음영처리를 해서 일반적인 화상텍스처 매핑을 해준 결과라고
가정 할 수 있는 것이다.

이번글은 여기에서 마무리 하고 다음 글에서는 실제로 블러하는 것에 대해 이야기 
하도록 한다.

Reference Links :
allosha님의 표면하 사란에 의한 스킨 셰이더
GPG Gems1. Chapter16. RealTime Approximations to Subsurface Scattering.
GPG Gems3. Chapter14. Advanced Techniques for Realistic Real Time Skin Rendering.
NVIDIA GDC 2007. Demo Teamp Secrets: Advanced Skin Rendering
----------------------------------------------------------------------------------------
ps.

틀린 부분이 있거나 이상한 부분이 있다면 언제든지 문의나 덧글 부탁 드립니다.

Posted by 붕대마음
TAG Skin, 피부

댓글을 달아 주세요


links
- 피부는 왜 피부처럼 보이는가? 1 : http://mgun.tistory.com/1545

이전글의 내용은 기존 렘버트 만으로는 피부 질감을 내기 어려워서
어두운 부분의 영역을 들어 올려 부드럽고 전체적으로 밝아지는
Half Lambert를 만들었고 여기에 원하는 피부의 부분에 원하는 만큼의
광택을 주기 위해 Specular Exponent와 Specular Mask를 추가해서 
하이라이트 반사를 표현 한다는 내용이었다. 

그런데 사실 이러한 내용들은 가짜 피부를 어떻게 하면 그럴 듯 하게 보일까 하는
일종의 꼼수이다.
즉, 피부의 특성을 고려하지 않고 대략적인 값으로 그럴듯 하게 보이도록 한 것이다.

그렇다면 실제 피부는 어떤 특성을 가지는가??


피부란 위와 같은 모습을 하고 있다.
의학 서적에서나 나올 것 같은 그림 인데 여기서 봐야 할 것은 피부가 결코 하나의
층으로 만들어 져 있는게 아니라는 것이다. 

즉, 인간의 피부 음영은, 표피에 닿은 빛의 단순한 반사나 확산만으로 결정되지 않는다.
추가적으로 피부 밑으로 침투해 피부 밑에서 난반사해서 다시 표피로부터
튀어 나오는 것도 고려
해 줘야 한다.

이렇게 피부 밑에서 산란하는 현상피하산란(Subskin Scattering)이라고 하며
반투명 물체에 빛이 들어와 내부에서 산란하고 나서 다시 튀어 나오는 일반적인 현상
표면하 산란(Subsurface Scattering)이라고 한다.

이에 대한 설명은 아래 링크에 좀 더 자세히 나와있다.
http://mgun.tistory.com/1294

표면하 산란을 정식으로 구현하면 피부 음영처리가 무척이나 복잡해 진다.
그래서 위와 같은 개념을 근사하게 하나씩 재현 해 나가면 비슷하게 만들 수 있을 거라는 생각을 
가지고 NVIDIA가 GeForce 8800시리즈 데모로 Adrianne의 스킨 셰이더를 만들었다.


link : http://www.nvidia.co.kr/coolstuff/demos#!/human-head
오~ 그럴듯하게 보이는걸...ㄷㄷ.

피부를 피부답게 보이게 하는 SSS.


피부뿐 아니라 아래와 같은 부분을 표현할 때에도 사용한다.


SSS는 결국 빛이 오브젝트의 표면의 한 지점으로 투과되어 내부로 퍼져나간후
다른 위치로 빠져나가는 현상을 말하는데 이때 표면의 종류와 두께에 따라서
보이는 정도 또한 다르다
. 위 사진의 오른쪾 아래, 얼음 사진을 보면 두께에 따라 
투과되는 정도가 다르다. 사람 몸의 경우 귀처럼 얇은 부분이 특히 그렇다.
크라이 엔진에서는 초목, 피부, 아이스 셰이더에 자주 사용되는 편이다.

언리얼에서의 SSS는 위와 같다.
link : https://udn.unrealengine.com/docs/ue3/KOR/Engine/Subsystems/Rendering/DirectX11/ScreenSpaceSSS/index.html


그림으로 요약해 보자면 아래와 같다.

일반적인 고체의 표면, 즉 불투명한 물체는 빛을 받으면 빛의 대부분을 그대로 반사시킨다.

 

Subsurface Scattering은 빛이 오브젝트의 표면의 한 지점으로
투과되어 내부로 퍼져나간 후 다른 위치로 빠져나가는 현상. 

 

피부는 대략적을 생각하면 아래와 같이 지방질, 표피, 진피라는 층들로 나뉜다.

인간의 피부 단면도

왼쪽 위 부터 얇은 지방질층, 표피, 진피
우측 위 부터 지방질, 표피, 지극히 작은 사이즈.

측정에 의하면 입사한 빛의 6%가 지방질층까지에서 반사가 되고 나머지 94%가 피하의
영향을 받는다고 한다.
대략적으로 피부의  최표층에서의 반사와 피부 밑에서의 산란, 이 두개의 처리로 나누어 보면 된다.

피하 산란의 개념도

표피에서의 반사는 위와 같고 이제 지방질층에서의 반사에 대해 생각 해 보자.

지방질층에서의 반사는 일반적으로 퐁이나 블린퐁을 사용하지만 이는 피부를 표현하는 데 있어
적합하지 않기 때문에 NVIDIA에서는 KS BRDF를 선택했다.


정면샷은 대략 비슷하지만 측면샷의 끝 부분을 보면 하이라이트가
더 리얼하게 맺히는 것을 볼 수 있다.

즉, 음영계산에서 기본 N,V,L 이외에 경면반사 강도와 면의 거친정도, 굴절률을 
고려해 준다는 의미이다.
경면반사강도는 하이라이트의 강도로 이해하면 되고 면의 거친 정도는
굴절률은 프레넬반사라고 생각 해 주면 된다.
면의 거친 정도는 말 그대로 면의 거친정도에 대한 값이다.
아래 링크를 참고하면 프레넬과 면의 거친정도에 대한 설명이 되어있다.
http://mgun.tistory.com/1518
http://mgun.tistory.com/1304

자!! 그럼 이제 얼굴의 어느부분에 빛을 어떻게 표현해야 할까? 를 고민해 봐야 한다.
하지만 친절하게도 이미 측정해서 SIGGRAPH에 발표되어 있다.

위 사진을 보면 안면의 10군데에서의 경면반사 강도와 면의 거친정도를 나타내고 있다.

위 값을 사용하기 위한 분포텍스처

사실 이 값들을 실제로 고려해 주면 좋지만 구현상 많은 부하를 차지하며
식이 복잡해 진다.

이 사진을 보면 오른쪽이 실제로 경면반사 강도 분포 텍스처와 면의 거칠기 분포 텍스처를 사용하여
만든 결과물 이고 왼쪽이 대략적인 평균값 0.3을 사용해서 만든 값이다.
그다지 큰 차이가 없다.
그래서 NVIDIA도 그냥 평균값을 사용했다고 한다.

표피와 지방질층에서의 반사를 알아보았다.
표피에서의 6%반사, 지방질층을 위한 KS BRDF, 그리고 피하에서의 빛의산란.
그렇다면 피하에서의 빛의산란(나머지 96%)는 어떻게 표현해야 하는가?

피하산란 계산은 간단하지 않다.
빛의 이동경로나 빛이 산란되어 나온 빛의 포함여부나 빛의 흡수 및 감쇄를 고려해야 한다.
이러한 내용들을 간략 근사화 해서 접근해 보자.

위에서 언급했던 피하산란 관련 그림을 다시 보자.


우선 알아야 하는 기본 현상을 적어보자면
- 빛이 다른곳에서 나온다.
   (즉, 빛이 입사한 위치에서 반사되는게 아니라 다른위치에서 반사되어 나온다.)
- 빛이 어디로 갔는지에 따라 착색이 된다.
   (즉, 빛이 어디까지 갔는지, 어디를 통과했는지에 따라 색이 변한다.)
- 외견상 불가능해 보이는 작업들이 있다.
   - 무한적으로 가능한 경로들.
   - 어떤 방향에 대한 영향인가?
- 물리학에서 모델의 산란
   - 산란 이벤트와의 거리가 얼마나 먼가?
   - 흡수 이벤트와의 거리가 얼마나 먼가?
- 많은 산란 이벤트가 light diffuse를 만든다.
   - 이러한 일들이 일어나기까지 얼마나 먼가?

좀 축약해 보자면...
빛이 산란해 다시 나올 때까지의 평균 거리는 어느 정도인가? 
빛이 흡수되어 버리는 평균 빈도는 어느정도인가?

입사광의 약 10%는 최초의 지방질층을 돌파하지만 이 시점에서 빛의 지향성을
잃고 확상광
이 되어 버리고, 나머지 빛들은 KS BRDF와 프레넬 반사를 고려한 반사광이었거나
지방질을 지나 표피에 도달한 시점까지에서 흡수된다.
결국, 이 지방질을 빠져나온 10%의 확산광에 대해서만 피하 산란을 생각해 주면 된다.
그렇다면 단순하게 입사광에 대해 확산 반사의 음영 처리를 실시해서
화상의 피부 텍스처와 곱하고, 앞에서의 KS BRDF + 프레넬 반사의 결과와 
합성하면 되지 않을까?
이 생각으로 구현한 결과물이 아래와 같다.


KS BRDF + 프레넬 + 확산반사 X 화상 텍스처.
하프라이프2의 스킨 셰이더와 거의 같다.
약간 건조한 느낌으로 보인다.

- cook (ks brdf) 관련 : http://mgun.tistory.com/1337
- fresnel 관련 : http://mgun.tistory.com/1518



왜이럴까?!!
- 한 지점으로 입사해서 다른 지점으로 나가는 라이트를 고려하지 않았다.
   (확산빛은 그 픽셀에 입사한 빛만 확산한 것이 아니라 인접하는 다른 픽셀에
    입사 한 빛이 피부내에서 산란해서 나온 확산빛도 포함되어진다.)
- 지방질층의 거친 표면은 불균형한 투과률을 가진다.

그래서! 다른방식으로 접근하자.
- 다중 레이어 재질의 몬테 카를로 렌더링.
- 2005 SIGGRAPHA Craig Donner and Henrik Wann Jensen.
   ( 피부의 광산란은 단층이 아닌 복수층)


오른쪽 단층 레이어 결과물은 납인형 같아 보인다.


Reference Links :
allosha님의 표면하 사란에 의한 스킨 셰이더
GPG Gems1. Chapter16. RealTime Approximations to Subsurface Scattering.
GPG Gems3. Chapter14. Advanced Techniques for Realistic Real Time Skin Rendering.
NVIDIA GDC 2007. Demo Teamp Secrets: Advanced Skin Rendering
----------------------------------------------------------------------------------------
ps.

틀린 부분이 있거나 이상한 부분이 있다면 언제든지 문의나 덧글 부탁 드립니다.

'Study > M's Lecture' 카테고리의 다른 글

피부는 왜 피부처럼 보이는가? 4  (0) 2014.01.05
피부는 왜 피부처럼 보이는가? 3  (0) 2013.12.18
피부는 왜 피부처럼 보이는가? 2  (0) 2013.12.13
피부는 왜 피부처럼 보이는가? 1  (0) 2013.12.02
Depth Of Field 2 (Advanced DOF)  (0) 2013.04.13
행렬  (0) 2013.03.21
Posted by 붕대마음
TAG Skin, 피부

댓글을 달아 주세요


물, 메탈, 그림자 이후 피부 시리즈이다.

물 관련 포스트는 아래 포스트를 참조하면 된다.
앞의 글 참조 
1. http://mgun.tistory.com/1282
2. http://mgun.tistory.com/1294
3. http://mgun.tistory.com/1304
4. http://mgun.tistory.com/1306
5. http://mgun.tistory.com/1351
6. http://mgun.tistory.com/1368  (비공개)

꽤 오래동안 쓴 물 관련 시리즈물인데 6번째 글이 비공개인 이유는 아직 쓰고 있기 때문이다.
마지막 글은 계속해서 추가되는 공부와 자료들로 늘 계속해서 이어질 수 있도록 비공개로 둔다.

메탈, 그림자 관련 강좌 시리즈도 아직 비공개인 이유는 아직 정리가 덜 되서..ㅎㅎ

그럼에도 피부시리즈를 시작하는 이유는 누군가의 요청 때문이다.
앞으로 쓰여질 이 글이 도움이 되길 바라며...
-------------------------------------------------------------------------------------

피부...
게임상에서 피부를 실제 피부처럼 만들기란 쉽지 않다.
diffuse 하나 그럴듯하게 그린다고 해서 피부처럼 보이지는 않는다.
피부를 피부처럼 보이게 하기 위해서는 Lighting을 살펴봐야 할 필요가 있다.

우선 가장 접근하기 쉬운 unreal의 예를 들어보자.

unreal에서는 기본적으로 퐁 반영반사를 쓰는데 custom으로 설정해서 하나씩 만들어 보자.


전형적인 N dot L 공식의 Lighting 이다.
날카로운 빛으로 각져 보인다.



Half Light로 Lighting을 수정했다.
훨씬 부드러워 보인다.

공식에 관한 내용은 아래 링크를 참고 하면 된다.
http://mgun.tistory.com/1306

후에 여기에 정반사를 위해 퐁 반사를 적용해 주는데 그냥 을 넣어주면 피부 전체에 적용되어
피부가 마치 금속처럼 보일 수 있다. 




brdf 모델에 따라 느낌이 많이 다르다.

 
피부에 전부 퐁 반사를 사용하면 금속처럼 보이는 문제를 해결하기 위해 어떻게 해야 할까?
원하는 곳에 원하는 만큼의 퐁 반사를 적용하면 되지 않을까?
어느 정도 강도의 하이라이트(광택)을 줄 지에 대한 분포 정보를 담는 텍스처를
Specular Exponent 라고 하고, 어느 곳에 어느 정도 강도의 반사를 줄 것인지의
분포 정보를 담는 텍스처를 Specular Mask라고 한다.

그리고 Specular Exponent Map은 광택을 조정하기에 Gloss Map 이라고도 불린다.

link : http://gamebanana.com/tuts/11134


 link : http://udn.epicgames.com/Three/MobileMaterialReferenceKR.html

여기까지가 unreal에서의 기본 반영반사를 설명한 글이다.
다음 글 부터는 피부 셰이더에 대한 기본 개념을 설명하고
어떻게 해야 사실같은 피부셰이더를 만들 수 있는지를 설명 한 후
게임에서 사용할 수 있는 정도의 피부 셰이더를 제시 할 예정이다. 

----------------------------------------------------------------------------------------
ps.

틀린 부분이 있거나 이상한 부분이 있다면 언제든지 문의나 덧글 부탁 드립니다.
 

'Study > M's Lecture' 카테고리의 다른 글

피부는 왜 피부처럼 보이는가? 3  (0) 2013.12.18
피부는 왜 피부처럼 보이는가? 2  (0) 2013.12.13
피부는 왜 피부처럼 보이는가? 1  (0) 2013.12.02
Depth Of Field 2 (Advanced DOF)  (0) 2013.04.13
행렬  (0) 2013.03.21
Depth Of Field 1 (Simple DOF)  (1) 2013.03.18
Posted by 붕대마음
TAG Skin, 피부

댓글을 달아 주세요

최근에 달린 댓글

최근에 받은 트랙백

글 보관함