프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by Silverchime
안녕하세요 흑룡해를 맞아 삼가 인사올립니다.
T모사의 뭐든 궁금해 하는 배경아티스트/TA Silverchime 입니다.

오늘은 프레넬 효과Fresnel Effect에 관해 이야기해보려 합니다.
누구나 한번쯤 들어 보셨겠죠? 반사쪽만 보면 매번 이 단어가 튀어나와서 참 힘들었네요. 그런데 막상 그게 무엇인지 설명을 부탁드려도 될까요? 하면 쉽게 말하기 힘든것도 사실입니다. 오늘 이 부분에 대해서 한번 이야기를 풀어보려 합니다.

물체가 우리에게 보이는 것은 빛이 물체에 반사해서 들어오는 것을 눈(시신경)이 감지하는 것입니다. 컴퓨터쪽으로 말하면 Diffuse, Specular, Reflection이 아마 기본이 될 것입니다.
<물체의 표면에 빛이 반사하는 모델>을 말할 때, Bidirectional reflectance distribution function. 즉 양방향반사분포함수... 약어로 BRDF라는 말을 씁니다.

왜 뜬금없이 BRDF모델이라는 생소한 단어를 꺼내느냐? 라고 물으신다면, 물체 표면에서 빛이 반사되는 성질을 우리는 이 여러가지 수학적 모델로 풀어내고 있으며, 또 위에서 말한 Diffuse, Specular 를 설명하는 것에도 역시 필요하기 때문입니다.
자, 맥스를 켜 보신다면 다음과 같은 매트리얼창을 참 많이 보셨을 겁니다. 이것이 바로 BRDF를 선택하는 풀다운 메뉴입니다. 이외로 가까운 곳에 있지요... ^^
 
일반적으로 Diffuse에 관한 모델은 Lambertian model, Oren–Nayar model 들이 대표적입니다.
그리고 Specular 모델은 리얼타임 게임쪽에서는 Blinn–Phong model 모델을 주로 사용합니다.
그리고 다른 방법으로 Reflection, Refraction이 추가가 될 것입니다. (여러가지 트릭과 기법으로...)

제가 이 글을 쓰게 된 계기는, 과연 매트한 재질에서 디퓨즈와 스페큘러를 알았다면, 이걸로 대부분의 조명을 설명해 낼 수 있는가- 였습니다. 그리고 계속 거리와 풍경, 발밑을 보면서 걸었습니다. 반짝이는걸 다 스페큘러 이런걸로 해석해봐도, 뭔가 좀 부족한게 아닌가... 이런 의문이었습니다. 특히 지하 복도 같은 곳에서는 특히 심했습니다. 그러다 한 곳에서 재미있는 글을 읽게 되었습니다.  
모든물체는 프레넬을 가진다- 라는 글이었습니다. 전 이 글을 읽고 너무나 기뻤습니다.
이참에 번역을 옮겨보도록 하겠습니다.

===============================================================================================
모든 물체는 프레넬을 가진다 - 
게임에서 가장 주요하게 쓰이는 Blinn–Phong model모델의 다이어그램을 보겠습니다.


H = normalize(V+L);
specVal = pow(saturate(dot(H,N)),power);


V는 View Vector, 즉 카메라의 위치를 가리킵니다. L은 Light 광원의 방향입니다.
N은 노멀 벡터, H는 둘의  하프벡터입니다.
공식과 그림에 따르면, 구체의 어느 지점이 가장 밝을(스페큘러 밸류가 높을)까요?  광원에서 들어온 빛이 바로 카메라를 직격하는 곳일겁니다. 기술적으로 말하면 하프벡터가 노멀과 일치하는 곳이 가장 밝을 것입니다. 광원이. 반사되서, 카메라를 때린다. 네 명확합니다.  

자 그럼 이번 다이어그램을 보겠습니다. 자 여기서도  노멀과 하프벡터가 일치한다고 한다고 가정하면, 위와 거의 일치하는 밝기가 나타나야겠죠? 이론상으로는 맞습니다만 실제 현실에서도 그럴까요?

답은 NO 입니다.



많이 보셨지요? 이런 현상. 단순히 사각 벽돌 매트리얼에서도 블린-퐁 스페큘러 모델이 다르게 나타납니다. 좌측은 편광필터로 디퓨즈만 뽑은것이고 우측은 스페큘러를 뽑은 사진입니다.
Glancing Angle( 아주 얕은 각도) 에서 같은 광원이라 할지라도 스페큘러가 훨씬 밝게 보이는 현상,
이걸 바로 프레넬 현상,  Fresnel Effect라고 합니다.
리얼타임 게임에서 메탈등에 사용되는 BRDF Schlick approximaion model을 사용하면 (GPU Gems 3 chapter on skin:) (Schlick 의 Approx 공식은 다음과 같습니다. )

float base = 1 – dot(V,H);
float exponential = pow( base, 5.0);
float fresnel = exponential + F0 * (1.0 – exponential);
specVal *= fresnel;

이러한 형식으로 프레넬의 밝기를 구할 수 있습니다.

사람들은 흔히 프레넬 현상을 알고 있다고 하더라도, 반짝이는 물체에서만 이 현상이 일어난다고 믿는 경향이 있습니다. 물이나, 유리, 금속 같은 경우지요. 그렇지만 사실은, 거의 모든 물체에서 강력하게 나타납니다. 오히려 반짝이지 않는 재질에서 더 극적으로 발생한다고 생각합니다.  

PVC 파이프 정면

 PVC 파이프 얕은 각도.  

골판지 상자

골판지 얕은 각도
 

짱돌

짱돌 얕은 각도
 

수건

수건 얕은 각도

하나더 짚고 가자면 X-Rite 카메라 칼라체커를 사용할때 주의사항으로, 언제나 카메라에 직각으로 대고 사용할것을 권장합니다. 왜 그런지 이제 논의 할 필요는 없겠지요. (당연히 더 밝아지니까요 색상이 다 변해버립니다. )

자 위 글까지는 그냥 프레넬에 관한 글과 공식을 옮긴것이고, 과연 그럼 프레넬이란 어떤현상인지 좀더 알아보겠습니다.

Augustin-Jean Fresnel  (/freɪˈnɛl/ fray-nel; French: [ɔɡystɛ̃ ʒɑ̃ fʁɛnɛl]; 1788–1827),


오귀스텡 쟝 프레넬. ( 프레스넬이 아닙니다 s가 묵음이라... 후... 저도 최근까지 프레스넬이라고 했는데 부끄럽네요 ///ㅅ/// ) 그냥 프레넬이라고 하겠습니다. 이분은 16세기말, 17세기에 파동광학 Wave Optics 의 확립에 크게 기여한 프랑스 엔지니어입니다.
 
1655년 뉴턴이 프리즘으로 스펙트럼을 분리한 이후, 반사와 굴절에 관한 연구는 그야말로 급진전했습니다. 16세기가 대항해시대가 한창이었을때니...

물체의 망원경이나 렌즈와 같은 옵티컬 디바이스에 대한 연구의 요구와 맞물려 수많은 발명이 이루어 졌습니다.  하지만 당시 빛이 프리즘에 분리되는걸 관찰하고 뉴턴은 빛은 입자다 하는 입자설을 주장했습니다, 지금에 와서는 입자와 파동이 혼재한다는걸 정설로 하고 있지만, 이 프레넬이란 분이 19세기에 파동설이 입자설을 대치하게 한 장본인중 한명이라니 대단하죠...
  물체의 반사와 굴절을 다루다보면 만나게되는 스넬의 법칙 Snell’s Law,  

왜 갑자기 또 뜬금없이 스넬의 법칙이냐고요? 왜냐하면, 스넬의 법칙은 바로 이 프레넬 방정식의 일부이기 때문입니다.
스넬의 법칙에 따르면, 두 매질medium이 마주하는 경계면에서 임계각 (Critical Angle)을 넘으면 전반사가 일어난다. - 즉, 입사된 모든 빛이 반사된다는 것입니다. 수학공식을 나열하면 머리가 엄청나게 아프실지도 모를 아티스트분들을 위해 사진을 준비해 보았습니다. 출처 : <동영상으로 보실분들은 요기

자 어떠셨나요?  이제 낮은 입사각에서 두 물체에서 반사가 일어나는 걸 아셨지요?

유리쪽에서 보면 40’ 언저리입니다. 유리에서->공기간의 Critical Angle은 41.8' 입니다.
 

이제 이 그림을 보시겠습니다.

좌측 그림에서 수영장의 수면이 거의 직각일때는 내부가 훤히 비쳐 보이지만, (거의 Tranmitted 되버림) 우측처럼 비스듬이 수면을 바라보면 하늘만이 거의다 반사되어 보이고 풀 내부는 거의 보이지 않습니다. (Reflection) 이는 위 Snell’s Law를 적용 받아 IOR(굴절율) 계수가 높아질수록, 점점 더 정면에서 벗어날수록, 각이 더 얕아질수록 반사가 더 강하게 일어난다는것입니다. (구체라면 중심부는 어둡고 주변부가 더 밝아 지겠지요)
 입사각 > 임계각 = 반사Reflection
 
입사각 < 임계각 = 굴절Transmission 

출처 : SketchupUcation

Glossiness는 실제 반짝거리는 강도를 결정한다면,

IOR(굴절율)이 강하면 강할수록 주변광 반사의 영향이 증가한다는것을 알 수 있습니다.

실제로도, Fresnel Reflection을 이용하는 매트리얼은 IOR 핸들러가 거의 반드시 있습니다. (ex) CryEngine, Unreal Engine 등)
비록 이것은 단지 빛을 투과하는 두 매질에서만 일어나는 것이 아니라는 것입니다. 실제 여러분의 현실에서 직각으로 볼때, 거의 제 색으로 보이다가, 비스듬히 보았을때 밝아지는 거의 모든 사물들이 있습니다. 이것은 단지 게임에서 쓰는 스페큘러 BRDF 모델인 Blinn-Phong 으로 설명할 수 없기에, 우리는 이것을 프레넬 효과(Fresnel Effect) 라고 부릅니다. 요즘엔 림라이트셰이더 rim-light shader로 많이들 fake하는데 바로 이 프레넬효과를 immitate하는 것입니다.  

대표적으로 카페인트. 단순히 블린-퐁 스페큘러만으로는 이런느낌은 힘들죠 시야각이 얕아질수록 점점더 밝아집니다.

다음으로 수면. 굴절이 되면서 수면아래 바닥이 보이네요.

그러나 Critical Angle을 넘어가면서 거울처럼 변해버립니다.


제가 출근길에 마구 찍은 사진입니다. 사실 프레넬 이펙트 안들어간거 찍기가 더 힘들어요. 가능하다면 게임에서도 향후 모든 매트리얼에 들어가지 않을까 합니다. (바램)

 

얼굴에 있는 유막때문에 사람피부 표현에도 프레넬을 적용한 예. (실제로는 훨씬 수많은 기법이 쓰였습니다만, 프레넬만 보겠습니다) 

Comparing Fresnel Formulations

When Computing Kelemen/Szirmay-Kalos Specular Reflectance

http://http.developer.nvidia.com/GPUGems3/gpugems3_ch14.html


자 이제 프레넬 효과에 대해 한번 알아보았습니다. 요약하면, BRDF Blinn-Phong만으로 설명할수 없는 빛의 스페큘러 반사가 존재한다.
그 반사는 정면에서 바라보면 크게 눈에 뜨이지 않지만, 얕은 각도로 보면 물체의 표면이 밝아진다. 이를 프레넬 효과라 한다. 이는 물체 경계면에서 굴절율IOR 에 따라 다르게 나타난다. 그리고...
모든 물체는 프레넬 이펙트를 가진다.
우... 기나긴글 수고하셨습니다. 이걸 다 읽으신 분이 있다면 진심으로 존경스럽습니다. 그리고 서투른 글 보아주셔서 감사드립니다. 솔직히 연구해가면서 쓴 글이라 틀린게 많을것 같아 걱정입니다. ㅠㅅㅠ아마 이걸 보신 다음 나가서 주변의 사물을 보시면 조금은 더 다르게 느껴지실까요? 해질녂 노을에 비친 풍경이나 바다를 보면서 한번쯤 생각해 주세요. 오귀스땡 쟝 프레넬이라는 멋진 사람을...그리고 이런것들을 하나하나 표현하려고 애쓰는 현대 그래픽 프로그래머들과 아티스트들도 말입니다.

그럼, 오늘도 부디 좋은 하루 되세요! ^^
 

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. Favicon of http://twitter.com/#!/mediahazard 미뎌 2012.01.05 11:30  댓글주소  수정/삭제  댓글쓰기

    우왓! 실버치매님 화이팅!

  3. Favicon of https://gamedevforever.com 핑속 2012.01.05 12:34 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 글 고맙습니다~ ^^

  4. Favicon of http://bluekms21.blog.me 크로스 2012.01.05 13:31  댓글주소  수정/삭제  댓글쓰기

    이건 누군가 출판을 해줘야 하지않나.. 라고 진지하게 생각해봅니다.
    용책,해골책,이책 이렇게 3권으로 3D를 시작해야 좋을텐데.. 하는 생각이!

  5. 죠쉬 2012.01.05 13:43  댓글주소  수정/삭제  댓글쓰기

    엑! 어렵다!
    그런데... 프랑스 사람이라면 프레넬이 아니라 프레네 라고 읽어야 하는거 아닌가용???
    ㅋㅋㅋ
    (달보라는데 손가락 깨무는 죠쉬)

  6. 이덕희 2012.01.05 14:29  댓글주소  수정/삭제  댓글쓰기

    좋은 글 잘 읽었습니다 :) 중간에 동영상 링크는 주소가 잘못된 것 같아요.

  7. 바다너구리대반란 2012.01.05 16:11  댓글주소  수정/삭제  댓글쓰기

    정말 좋은 글 감사히 읽엇습니다^^ 쓰시느라 고생많으셧겟어요ㅠㅠ

  8. Favicon of http://sumnomm.blog.me sumnomm 2012.01.05 23:18  댓글주소  수정/삭제  댓글쓰기

    와 저도 쉐이더를 제작할때 페이크 림라이트를 애용했었는데 이렇게 자세한 원리까지는 생각을 못해봤었네요.
    좋은글 감사합니다.

  9. Favicon of https://gamedevforever.com 원숭이사냥꾼 2012.01.06 03:37 신고  댓글주소  수정/삭제  댓글쓰기

    머리에 쏙쏙 들어옵니다 ㅠㅠ 감동~

  10. Favicon of http://hokoodo.lil.to 호빵 2012.01.06 14:06  댓글주소  수정/삭제  댓글쓰기

    여태 온갖 싸이트를 뒤져봤지만
    프레넬에 대해 가장 이해하기 쉬운 글이네요.
    답답함을 뚫어 주셔서 감사합니다.

    • Favicon of https://gamedevforever.com Silverchime 2012.01.10 15:00 신고  댓글주소  수정/삭제

      감사합니다. 설명드리려고 하는 과정에 제가 더 모르는 부분을 많이 해소한거 같아요... ^^ 결과를 나눌수 있어서 즐겁습니다.

  11. Favicon of https://gamedevforever.com ozlael 2012.01.07 00:57 신고  댓글주소  수정/삭제  댓글쓰기

    치매님 만세 !!!!

  12. 66v 2012.01.09 11:20  댓글주소  수정/삭제  댓글쓰기

    좋은 글 잘 읽었습니다.

    올바른 물리공식에 근거하여 시각적 품질향상을 조절한다는 취지는
    2009년 CEDEC에서 TRI-ACE의 고탄다 사장이 발표한 프리젠테이션의 목적과 완전히 일치하는 군요!

    혹시 일어가 가능하시거나, 아니면 일어 해석이 가능하신 플머분이 주위에 계신다면
    http://research.tri-ace.com/
    이 페이지에서
    'Beyond a glare effect for HDR Rendering - Basic of Reflectance'
    이 슬라이드 내용이 굉장히 마음에 드실 것 같아요!

    요약하자면 기존의 단순화된 Blinn-Phong공식의 문제점을 지적하고
    개량된 BRDF공식을 제안하고 있습니다.
    새로운 공식은 물리적인 정확성을 보장하기 때문에,
    기존의 아티스트가 자신의 감각에 따라 각종 수치를 이리저리 조절하면서 겪었던
    불필요한 시행착오를 없앨 수 있다는 내용입니다.

  13. samchawon 2012.01.10 16:45  댓글주소  수정/삭제  댓글쓰기

    뜬금없이 '빛은 파동이냐 입자냐' 라는 논쟁이 떠오르네요~
    이런거 부담없이 사용 할수 있을때 까지 오래 오래 살아 보아요~

  14. 홍일도 2012.02.01 09:10  댓글주소  수정/삭제  댓글쓰기

    감사합니다. 잘봤습니다!

  15. Favicon of http://pupana.net 좐느 2012.03.06 00:22  댓글주소  수정/삭제  댓글쓰기

    vray 공부하다 와보게 되었습니다. 100%이해 하지는 못했지만.
    다양한 자료와 설명이 유익하네요.
    프레스넬이 아닌 프레넬에 관해서 조금은 더 알게 되었습니다. 감사해요.

  16. Favicon of http://blog.naver.com/othiai4239 오르세미술관 2012.04.04 00:27  댓글주소  수정/삭제  댓글쓰기

    글 정말 잘 읽었습니다..
    정말 존경스럽네요..^^
    언리얼 엔진 메터리얼 공부하다 이부분이 궁금해서 찾다가 우연히
    좋은 정보 찾게되었네요...
    다는 이해 안가지만,,,,몇번 읽어보고 이해하도록 하겠어요..

    감사합니다...^^

  17. 무한지로 2012.04.28 23:30  댓글주소  수정/삭제  댓글쓰기

    너무 멋지십니다.. 쬐금 알고 있던 정보를 확실하게 다듬게 될 정도로 멋지네요~
    아주 잘봤습니다~
    언리얼에 왜 이렇게 프리넬 값을 자주 사용하나 했었는데,, 머리가 확 깨는 정보 였습니다~

  18. 땡글 2013.11.01 15:12  댓글주소  수정/삭제  댓글쓰기

    그동안 그냥 기능으로만 사용해 왔었는데 글 잘 보았습니다. 이해안되는 부분도 있지만 첨부하신 이미지를 보고 오- 한 곳도 있었습니다. 역시 긴 글보다 한번 보는게 더(;;;)글 읽고 나서 책상 주변에 있는 물건들을 다시 보게 되었습니다~

  19. 민's 2015.03.31 00:33  댓글주소  수정/삭제  댓글쓰기

    왜 해외 3D 강의에서 Fresnel을 자주 사용하는지 알겟네요^^
    쉬운설명 감사합니다. 입사각, 임계각이 무엇인지도 틀을 잡은거 같네요

  20. 마술감자 2015.11.23 23:50  댓글주소  수정/삭제  댓글쓰기

    좋은글 감사합니다 :)

  21. Clark 2016.01.27 23:49  댓글주소  수정/삭제  댓글쓰기

    우앙!!!!! 정말 잘보고 갑니다!!!
    한번봐서 그냥 겉핥기라서 링크해두고 두고두고 봐야겠어용
    좋은 자료 감사합니닷!!!