이 부분은 서적에서 중요시 다루지 않았네요. 내부적으로 처리 해서 인지, 아니면 다른 기술이 적용 되서 그런 건지는 모르겠지만, 학과에서 배웠던 내용에 기반해서 설명해 볼게요.
우리가 색상을 인지하는 것은 빛이 물체에 "반사" 되어서 특정한 가시광선이 들어오는 것 인데요, 이러한 실세계에서의 것을 컴퓨터로 표현하기에는 굉장한 제한이 따르게 됩니다. 일단 살포시 예시 그림을 보여드릴 게요.
뭐 다양하게 빛이 우리 눈으로 들어오게 되고, 그 때 들어온 빛의 성분에서 어떤 가시광선 색이 더 많이 있느냐를 가지고 해당 물체로 부터 온 색이 뭔지 알 수 있게 되는 것입니다.(태양으로 부터 들어온 빛도 물론 볼 수 있지만, 세기가 너무 강해서 직접 보기는 힘들죠:-D) 그런데 저렇게 수많은 빛의 반사로 부터 파생되는 또 다른 빛의 반사... 게다가 오는 방향이 선분 하나가 아니라 무한개의 빛의 선분이 들어오기 때문에 유한개의 계산을 처리하는 컴퓨터에서 이러한 부분을 표현하기가 힘들답니다.
그래서 Phong이라는 사람이 자신의 이름을 따서 Phong Model을 제시하게 되는데, 이것은 빛의 반사중에서 중요한 부분만을 가지고 계산양을 줄이면서 그럴싸한 모습을 보이게 만들었습니다.
사진 출처 : http://en.wikipedia.org/wiki/File:Phong_components_version_4.png
이 세가지 성분의 합성으로 간단히 물체를 표현하는 것이죠.
빛이 존재한다는 가정하에(glEnable(GL_LIGHTING)) 위의 세가지 성분을 모두 더한 값이 해당 부분의 결과적인 색상으로 표현 되는 거죠! 하지만 빛이 한 군대면 상관 없지만, 여러군대에서 들어올 수도 있잖아요? 예를 들어서 달밤(광원1)이 떠있는 초원에 어떤 사람이 횃불(광원2)을 들고 서있는 광경은 어떤가요?
일단 단일 광원에 대한 공식은 아래와 같습니다.
다중 광원에 대한 일반 공식은 아래와 같습니다.
모든 광원에 대해서 합한 것을 다 더해주면 되는데, 앞서 설명한 바와 같이 환경광은 자신이 가지고 있는 고유한 색상만을 표현 하기 때문에 광원의 개수가 늘어난다고 해도 고유의 색상은 변하지 않겠죠? :-D
참조 : OPENGL GAME PROGRAMMING(Foreword by Mark J.Kilgard)
우리가 색상을 인지하는 것은 빛이 물체에 "반사" 되어서 특정한 가시광선이 들어오는 것 인데요, 이러한 실세계에서의 것을 컴퓨터로 표현하기에는 굉장한 제한이 따르게 됩니다. 일단 살포시 예시 그림을 보여드릴 게요.
뭐 다양하게 빛이 우리 눈으로 들어오게 되고, 그 때 들어온 빛의 성분에서 어떤 가시광선 색이 더 많이 있느냐를 가지고 해당 물체로 부터 온 색이 뭔지 알 수 있게 되는 것입니다.(태양으로 부터 들어온 빛도 물론 볼 수 있지만, 세기가 너무 강해서 직접 보기는 힘들죠:-D) 그런데 저렇게 수많은 빛의 반사로 부터 파생되는 또 다른 빛의 반사... 게다가 오는 방향이 선분 하나가 아니라 무한개의 빛의 선분이 들어오기 때문에 유한개의 계산을 처리하는 컴퓨터에서 이러한 부분을 표현하기가 힘들답니다.
그래서 Phong이라는 사람이 자신의 이름을 따서 Phong Model을 제시하게 되는데, 이것은 빛의 반사중에서 중요한 부분만을 가지고 계산양을 줄이면서 그럴싸한 모습을 보이게 만들었습니다.
Phong Model에서 성분을 세가지로 나누는데 아래와 같습니다.
사진 출처 : http://en.wikipedia.org/wiki/File:Phong_components_version_4.png
이 세가지 성분의 합성으로 간단히 물체를 표현하는 것이죠.
- Ambient Light환경광 이라고 합니다. 물체자체는 자신의 원래 색을 단순히 표현 하는 것이죠.
공식은 아래와 같습니다.
- Diffuse Light산란광 이라고도 해요. 모든 방향에 대해서 반사되는 색상만을 계산한 것입니다. 간단히 하나의 면에 대해서 생각하게 된다면 물체가 가진 법선 벡터가 있을 거에요. 그리고 빛이 들어오는 방향이 있을 것이고.. 그거만 가지고 생각하는 겁니다.
아래 그림은 면 하나를 생각 했을 때의 모습입니다. 평면 p상에서의 어떠한 벡터와도 수직을 이루는 벡터를 법선 벡터라고 합니다. 면(face)마다 그러한 벡터가 존재 하게 됩니다.
이것을 2차원 상에서 보았을 때 빛이 들어온 방향에 대한 벡터를 도식화 하면 아래와 같겠죠?
공식은 아래와 같습니다.
- Specular Light경면광 또는 반사광이라고 하는데, 경면광이라는 것은 사전 검색에서 나오질 않네요;;; 아래 그림을 보면 아시겠지만, 빛이 유독 반사되어서 맨들맨들한 부분을 얘기하는 거에요.
diffuse light에 대해서 설명할 때 사용했던 2차원 상에서의 그림에 약간 추가 됩니다. r은 빛이 들어온 방향(l)과 법선 벡터(n)의 각도 만큼 더 진행되는 방향 벡터 이고 v는 관측자(여기선 camera 겠죠?:-D)가 해당 평면을 바라본 방향 벡터를 의미 합니다.
빛이 존재한다는 가정하에(glEnable(GL_LIGHTING)) 위의 세가지 성분을 모두 더한 값이 해당 부분의 결과적인 색상으로 표현 되는 거죠! 하지만 빛이 한 군대면 상관 없지만, 여러군대에서 들어올 수도 있잖아요? 예를 들어서 달밤(광원1)이 떠있는 초원에 어떤 사람이 횃불(광원2)을 들고 서있는 광경은 어떤가요?
일단 단일 광원에 대한 공식은 아래와 같습니다.
다중 광원에 대한 일반 공식은 아래와 같습니다.
모든 광원에 대해서 합한 것을 다 더해주면 되는데, 앞서 설명한 바와 같이 환경광은 자신이 가지고 있는 고유한 색상만을 표현 하기 때문에 광원의 개수가 늘어난다고 해도 고유의 색상은 변하지 않겠죠? :-D
참조 : OPENGL GAME PROGRAMMING(Foreword by Mark J.Kilgard)
'Theory > Graphic' 카테고리의 다른 글
텍스쳐 바르기(Texture Mapping) (0) | 2011.12.19 |
---|---|
투영(Projection) (0) | 2011.12.17 |