Graphics/DirectX

Direct 3D - 조명모델

MOLOKINI 2014. 7. 12. 14:14
조명모델
3D 그래픽의 표현 방법 중 가장 중요한 것이 조명 모델이다.
광원으로부터 점들의 조도를 계산하는 방법을 조명모델이라 한다.
이 방법에는 여러가지가 있는데, 경험모델과 물리모델로 나뉜다.
경험모델은 관찰된 현상을 근사값으로 표현하기위해 간단하게 수식화 한 것으로, 물리학적 근거가 없는 '해보니까 괜츈하네?'라는 식의 모델이다....
물리모델은 빛과 물질간의 상호작용을 실제 물리적 성질에 기반하여 모델링한 것이다. 과학적 근거가 있는 모델.




한 점의 색은 여러개의 광원으로 부터 출발한 빛이 여러단계를 거쳐 표면에서 어떻게 반사될 것인지에 의해 결정된다. 이 광원에 대해서 알아보자.

주변광원(Ambient)
주변광원이란 동일한 밝기의 빛이 장면 안의 모든 표면에서 일정하게 반사되는것을 말한다.
실제 현실 세계에서는 존재하지 않는 수학적 형태의 빛이다. 모든 방향에서 일정하게 주어지기 때문에 수학적 연산이 쉽다. 

지향광원(directional)
한 방향으로 무한히 뻗어나가는 빛을 말하며, 거리에 상관없이 특정한 한 방향(벡터)에 대해 일정하게 주어진다. 이것 역시 수학적인 형태의 광원으로, 물리적인 근거는 없다. 비슷한 예로는 태양광이 있다..

점 광원(point)
백열전구를 모델링한 것이라고 생각하면 된다.
한 점을 중심으로 주변으로 퍼져나가는 빛을 나타낸다.
점 광원은 광원과 빛이 반사될 표면과의 거리의 제곱에 비례하여 밝기가 감쇠되며, 렌더링 될 때 마다 정점, 혹은 픽셀에 대해서 광원과의 벡터를 구해야 한다.
상당한 양의 벡터연산을 해야 하므로 주변 광원이나 지향 광원에 비해서 연산속도가 느린 편이다.

Direct3D의 감쇠 모델은 다음과 같다.
                            1                  
atten = att0i + att1i * d + att2i * d^2

변수                      기본값                          타입                    설명              
att0                           0                              FLOAT                상수
att1                           0                              FLOAT                선형 감쇠값
att2                           0                              FLOAT                2차 감쇠값
d                            N/A                            FLOAT                광원과의 거리



점적광원(spot)
점 광원의 특징은 방향이 없이 전체로 퍼져나가고, 거리에 따라사 밝기가 감쇠된다는 것이다.
이에 반해, 점적광원은 특정한 한 방향으로만 퍼져나가도록 한 것이다.
무대의 스포트라이트!


직접조명
조명에는 크게 직접조명과 전역조명이 있다.
직접조명은 물체 표면의 점들이 장면 내의 모든 광원들로부터 직접적으로 받는 빛을 말한다.
전역조명은 다른 물체를 거쳐서 받는 빛까지 모두 포함한 것

주변조명
주변조명은 주변광원에서 설명한대로 정면 전반에 걸쳐 일정한 빛의 강도가 주어지는 조명이다.
Ilocal = Kambient * Iambient

확산조명
표면이 반사되는 빛의 강도는 view(보는)방향과는 관계없이, 표면과 빛의 방향에 의해 영향을 받는다. 이걸 램버트 반사, or 램버트의 코사인 법칙이라고 한다.

Id = Kd * Id * cos세타 = Id * Kd (NL)

여기서 Kd는 확산 조명 계수, Id는 빛의 강도, N은 법선 벡터, L은 광원벡터이며, N, L은 단위벡터이다.

내적 연산의 결과가 음수값이 나올 수 있으므로 최소값을 0으로 해서 수식을 다시 정의하면 다음과 같다.

Id = Kd * Id * cos세타 = Id * Kd max(NL, 0)      (단, N과 L은 단위벡터)

직관적으로 생각해 봐도 빛의 입사각이 0도일 때 가장 빛이 많이 반사되고 90도에 가까울 수록 빛의 반사량은 적어진다는 것을 알 수 있다. 0도일 때 1이고 90도일 때 0에 해당하는 함수는 코사인 함수라서 이런 식이 나오는 것.

원래 컴퓨터 그래픽스의 조명모델은 간단한 주변조명과 램버트 조명을 시작으로 기술의 발전과 함께 더 복잡하고 정교한 항을 추가해 나가게 되었다. 
주변조명과 확산조명을 합한 수식은 다음과 같다.

Ida = Ia * Ka + Id * Kd max(NL, 0)                 (단, Ka는 주변 조명 계수)

반사조명
코팅된 차량이나 금속성의 물체의 표면은 유난히 반짝이는 하이라이트가 형성되는걸 볼 수 있다. 이건 보는사람의 시점에 따라서 바뀌는데, 이걸 반사조명이라구한다
완벽한 반사조명모델은 물리적 근거에 입각해 계산해야 하지만, 다음의 수식으로 비슷한 결과를 얻어낼 수 있다.

Is = Is * Ks(cos오메가)^n = Is * Ks(VR)^n   (단, Ks는 반사 조명 계수, V는 카메라벡터, R은 반사벡터)

n의 제곱의 값에 따라서 반사조명의 양은 작아진다.
n = 1일 때는 반사량이 많고, n = 64일 때는 반사량이 작다.

그런데.. 짐 블린이란 분께서 반사벡터 R을 구하지 않고도 좀 더 쉽게 구할 수 있는 중간벡터 H를 사용해도 비슷한 결과를 얻어낸다는 것을 알아냈다.
위대하신분이시네요..
그래서 수정된 수식은
Is = Is * Ks max(NH, 0)^n (NL > 0)     (단, NL > 0일 때 1, NL <= 0일 때 0이다.)

방출조명
특정한 물체들은 빛을 반사할 뿐만 아니라, 빛을 뿜기도 하는데, 이러한 조명을 방출조명이라구 한다.
방출조명은 단순하게 방출조명의 색을 더해주기만 하면 된다.

Ie = E

직접조명정리
직접조명은 최종값을 얻기 위해서 주변 + 확산 + 반사 + 방출 조명값을 합친 값이다.
이를 수식으로 최종적으로 정리하면 아래와 같다.. 
            주변   +                          확산   +                                반사 +                        방출
Itotal = Ka * Ia + lights시그마i=1 (Id*Kd max(NLi, 0) + Is*Ks max(NHi, 0)^n(NLi > 0)) + E
와...... ㅇㅋ 어쨋든 네개를 합친 것


전역조명
전역조명 기법은 라디오시티, 광선추적, 포톤맵핑등 다양하지만, 여기서는 최근에 많은 관심을 받고있고 손쉽게 구현 가능한 반구조명기법에 대해 알아보도록 하자.

반구조명
일반조명은 (주변광 색 + 확산광 색 + 확산광 방향)으로 이루어진다, 이를 좀 더 그럴듯한 환경광으로 바꾸기 위해서, 천반구와 지반구의 광원색으로 구성하여 두개의 반구색을 합성하는 기법이 반구조명 기법이다. 이때, 색 합성에는 반구의 축과 지축과의 각도를 사용한다.

이런 형태인데,



 

반구조명 합성 공식은 아래와 같다.

Cvertex = (0.5 + cos세타)Csky + (0.5 - cos세타) Cground 

(단, Csky는 천반구색, Cground는 지반구색)


그래서 최종적으로는 천반구와 지반구의 색이 합쳐지는 것..



하지만 이렇게 해가지고서는 만족할만한 결과가 나오지 않는다.

여기에다가 확산광을 하나 추가시켜보자.

사용되는 공식은 '반구조명 + 램버트 확산 조명'을 사용한다.

 그래서 이건..

Cvertex = max(NL) + (0.5 + cos세타)Csky + (0.5 - cos세타) Cground

(단, N은 표면 법선 벡터, L은 광원 벡터)


식이 유도되는건,, 아주 간단히 말하면

천반구의 색 + 지반구의 색 = 반구조명

반구조명 + 램버트 광원 = 최종 색


ㅇㅋ?



반구조명응용

반구조명을 진정한 전역조명모델이라고 하기엔 아직 무리가 있다.

왜냐, 전역조명이라면 최종색을 결정할 때, 단순히 천반구, 지반구, 확산광 외에도 주변 면들의 색에 의한 영향을 받아야 하기 때문,,, 실세계에서 차폐물에 의해 빛이 가려지는 경우도 있어, 그런 처리까지 해줘야한다..



'Graphics > DirectX' 카테고리의 다른 글

Direct 3D - 라이트 맵핑  (0) 2014.07.23
Direct 3D - 텍스쳐  (0) 2014.07.21
Direct 3D - 사원수 (Quaternion)  (0) 2014.07.08
Direct 3D - 렌더링 파이프라인  (1) 2014.06.19
Direct 3D - 행렬  (0) 2014.06.19