OpenGL

[OpenGL-8] Lighting

zamezzz 2017. 3. 16. 23:01

안녕하세요.


오늘은 Lighting에 대해서 정리해보겠습니다.


말 그대로 그래픽에서의 빛에 대한 개념이라고 생각하시면 됩니다.


순서는 다음과 같습니다.



8.1. Light Sources

8.2. Surface Type



  8.1 Light Sources


우리말로 번역하자면 광원이라는 뜻입니다. 빛이 시작되는 곳이라고 생각하시면 됩니다.


이 Light Source에도 여러 가지 종류가 존재합니다. 빛은 그 종류가 다양하기 때문이죠


Point light sources


첫 번째 광원은 '점광원'입니다.


하나의 점에서부터 빛 에너지가 시작됩니다. 아래 사진을 보시죠

하나의 점에서부터 시작된 빛이 객체에 직접 영향을 끼치고 있습니다.


점 광원에서 가장 중요한 것은 위치와 방향, 그리고 뿜어져 나오는 빛의 색입니다.


이 3가지 요소의 영향을 받아 객체로 직접 빛을 쏘는 것이죠.


 Infinitely distant light sources


두 번째 광원은 '무한대 광원'입니다. 점광원이 아주 멀리 있다고 생각하시면 됩니다.


우리에게 있어서 '태양'이라고 생각하시면 됩니다. 아주 멀리서 전체적으로 영향을


끼치는 형태입니다. 보통 정해진 빛의 색과 방향이 있습니다.


 Directional light sources


세 번째 광원은 '방향 광원'입니다. 위치는 없고 방향만 존재합니다.



이처럼 특정한 같은 방향으로 빛이 들어옵니다. 정해진 구체적인 광원의 위치는 없으며,


빛의 방향이 객체에 중요한 영향을 끼칩니다.


 Radial intensity attenuation


위에서 총 3가지 큰 '광원'의 종류를 알아보았습니다.


빛은 가까이 있을 때 밝고, 멀어질수록 어둡다는 특징이 있죠 (당연하죠 ?)


그렇기에 빛은 거리에 따라 약해집니다. 하지만 태양과 같은 무한대 광원은 예외입니다.


무한대 광원은 감쇄가 없으며, 점 광원은 그 거리에 따라 감쇄가 있습니다.


이를 식으로 표현하면 아래와 같이 유도할 수 있습니다.






  8.2 Surface Type


이번에는 표면 타입에 대해서 정리해봅시다.


단순히 광원만 존재한다고 하여 모두 같은 빛의 영향을 받는 것이 아닙니다.


표면(Surface)의 종류에 따라 빛을 반사하는 정도가 모두 다르기 때문이죠.


이 Light Source에도 여러 가지 종류가 존재합니다. 빛은 그 종류가 다양하기 때문이죠


 Surface Type


아래 두 가지의 표면을 보시죠.


부드러운 표면 


거친 표면


부드러운 표면의 경우 빛이 반사되는 것이 일정합니다. 그렇기에 완전히 부드러운 표면일


경우에는 입사각과 반사각이 거의 같다고 볼 수 있어요.


반대로 오른쪽 사진과 같이 거친 표면에서는 난반사가 일어납니다.


들어온 빛이 어디로 튀어나갈지 모르기에 다루기가 어렵습니다.


그러기에 우리는 퐁 모델이라는 것을 사용하여 객체를 표현하고자 합니다.


 Phong Model


Phong Model(퐁 모델)입니다. 이는 다음 3가지 요소로 빠르게 계산할 수 있습니다.

- Diffuse

- Specular

- Ambient


● Diffuse Reflection


먼저 Diffuse Reflection부터 봅시다. 난반사라고도 불립니다.


위 사진이 이상적인 난반사 표면으로 람버시안(Lambertian)이라고도 불리웁니다.


같은 방향으로 빛이 들어와도 모든 서로 다른 방향으로 퍼지는 형태입니다.


표면이 빛의 방향을 향할 때 가장 밝고, 정 반대일 때 가장 어둡습니다.


이러한 성질을 통해 Diffuse Reflection의 식은 다음과 같이 나타낼 수 있습니다.


여기서 은 조명의 밝기, 색을 뜻합니다 (r,g,b)


그리고 는 Diffuse 계수 (빛을 얼마나 반사하는지 정도)를 뜻합니다.


N은 노말벡터이고, L은 빛의 방향 (단위벡터) 입니다.


● Ambient Reflection


두 번째는 Ambient Light입니다. 


빛이 닿지 않는 면이라도 아예 까맣게 느껴지지는 않습니다.


반사되는 빛에 의해 간접적인 영향을 받기때문이죠. 즉 Ambient Light는 간접광을 뜻해요


이를 구하는 식은 다음과 같습니다.

는 표면으로부터 반사되는 빛의 비율입니다. ambient 반사 계수라고 생각하면 됩니다.

는 반사되는 빛의 밝기 (강함 정도) 입니다.


● Specular Reflection


마지막은 Specular Reflection입니다. 위의 Phong model 객체에서 하얀색 부분이에요


즉, 하이라이트라고 생각하시면 될 것 같습니다.


객체를 보다 사실적으로 표현해주는데 꼭 필요하죠.


이를 구하는 식은 조금 복잡하니 아래 그림과 함께 봅시다.


L은 입사각이며, R은 반사각 입니다. 그리고 V는 시선(카메라)의 방향입니다.


V=R이면 빛이 가장 많이 보입니다. 눈으로 빛이 바로 들어오니 당연하죠?


Ks는 물질의 특성에 따른 Specular reflection 계수입니다. Ks=1 일때, 90도입니다


는 이전과 같이 입사되는 빛의 밝기 정도를 뜻합니다.


이를 크로스 프로덕트 하여 위의 식을 유도해나갈 수 있습니다. 


● Ambient + Diffuse + Specular Reflection


이제 3가지를 모두 더해주면 우리가 구하고자 하는 Phong model을 구현할 수 있습니다.



최종적으로 찾아낸 식이 바로 위의 I를 구하는 식 입니다.


세가지 reflection에서 유도된 식을 더해준 것 뿐입니다.



오늘은 Lighting에 대해서 정리하였습니다.


다음 포스팅에서는 이를 바탕으로 실제 객체를 구현해보겠습니다.


감사합니다.

반응형

'OpenGL' 카테고리의 다른 글

[OpenGL-10] object viewer 구현하기 (2)  (0) 2017.05.17
[OpenGL-9] object viewer 구현하기 (1)  (13) 2017.04.06
[OpenGL-7] Projection Matix  (0) 2016.12.31
[OpenGL-6] Model View Matrix  (2) 2016.11.13
[OpenGL-5] Cube Control Program  (1) 2016.11.02