본문 바로가기

공부/Open GL ES를 이용한 3차원 컴퓨터 그래픽스 입문

[Open GL ES를 이용한 3차원 컴퓨터 그래픽스 입문] 챕터 9 - 라이팅 (디퓨즈, 스페큘러) [1/2]

728x90
반응형

 

 

 

  • 라이팅(lighting 혹은 illumination)빛과 물체 간 상호작용을 처리하는 기술이다.
  • 이 장에서는 퐁(Phong)이 제안한 라이팅 기법(퐁 모델)을 소개하고, 어떻게 쉐이더로 구현되는지 설명한다.

 

 

 

 


 

 

 

 

9.1 퐁 모델

  • 라이팅을 위해서는 우선 광원(light source)을 정의해야 한다.
  • 간단한 광원 중 하나는 점 광원(point light source)으로, 이는 3차원 공간의 한 점(point)으로부터 전방위로 빛이 발산되는 것

 

  • 근처에서 가장 쉽게 볼 수 있는 광원중에 하나인 태양은 매우 강력한 광원이 아주 멀리 존재하는 경우이다.
  • 물체 표면의 여러 점에 입사하는 햇빛의 방향은 서로 평행하다고 가정해도 무리가 없다. 이런 광원을 방향성 광원(directional light source)라고 한다.
  • 방향성 광원을 다룰 때에는, 광원의 색상단일한 입사 방향만 고려하면 된다.
  • 이 책에서는 방향성 광원 하나만 다루고 있다.

 

  • 퐁 모델은 물체 표면에서 감지되는 색상을 디퓨즈(diffuse), 스페큘러(specular), 앰비언트(ambient), 발산광(emissive light) 네 가지 항목으로 분리해서 처리한다.

 

 

 

 


 

 

 

 

9.1.1 디퓨즈 항 - 난반사

 

 

디퓨즈 반사

 

 

  • 디퓨즈 표면이라 불리는 이상적인 표면으로 들어온 빛은 그림과 같이 모든 방향을 따라 같은 강도로 반사된다. 이를 난반사라고 한다.
  • 카메라에 의해 감지되는 빛은 카메라의 시선에 무관하며 오로지 물체 표면에 들어오는 빛의 양에 비례하게 된다. 
  • 물체 표면으로 들어오는 빛의 방향은 이른바 빛 벡터(light vector)에 의해 정의된다.

 

  • 물체 표면의 점 p의 노멀(noraml) n과 빛 벡터 l사이의 각도 ∂입사각(incident angle)이라고 하는데, ∂가 작을수록 p는 더 많은 빛을 받는다.
  • n과 l의 내적을 사용하여 p에 들어오는 빛의 양을 결정할 수 있다.
  • cos∂는 점 p가 받는 빛의 양을 결정하게 된다.

 

∂가 90도보다 크면 p는 빛을 받지 않는다.

  • 위 식은 n · l이 음수가 되는 경우 0을 선택하여 p에 들어오는 빛의 양을 0으로 만든다.
  • 위 식은 점 p에 들어오는 빛의 '강도'만을 결정한다.

 

 

반사되는 빛의 '색상'은 다음과 같이 정의된다.

 

  • 여기서 s_d는 광원의 RGB 색상을, m_d는 물체의 디퓨즈 계수(diffuse reflectance)를 나타낸다.
  • (표기법에서 s는 광원(light source)을, m은 재질(material)을 의미한다.)

 

앞의 식으로 강도를, 뒤의 식으로 색상을 나타낸다.

 

디퓨즈 항에 의해 렌더링된 주전자

  • 다음 그림의 주전자는 디퓨즈 항에 의해서만 렌더링되었다.

 

 

 


 

 

 

 

9.1.2 스페큘러 항 - 정반사

 

스페큘러 반사

 

  • 퐁 모델의 스페큘러 항은 물체 표면에 하이라이트(hightlight)를 만드는 데 사용된다.
  • 이를 위해 시선 벡터(view vector)반사 벡터(reflection vector)가 필요하다.
  • 시선 벡터는 물체 표면의 점 p와 카메라를 연결하는 것으로 v로 표기된다. 빛 벡터 l과 마찬가지로 v 역시 실제 카메라 시선과 반대 방향으로 정의된다.

 

반사 벡터 계산

 

  • p에 들어온 빛이 입사각 ∂와 동일한 각도를 이루며 반사되는 것정반사라고 하는데, 이 방향을 따른 벡터가 반사 벡터이며 r로 표기한다.
  • n과 l이 이루는 입사각 ∂는 n과 r이 이루는 반사각과 같다.두 직각삼각형은벡터 ncos∂로표현된 변을공유한다.왼쪽삼각형의 l과 ncos∂를 연결하는 벡터를 s로 표기하자
  • l이 단위 벡터이므로 r 역시 단위 벡터가 된다.

 

스페큘러(쩡반사)는 카메라의 위치가 중요하다.

 

  • 디퓨즈(난반사)는 카메라가 어느 위치에 있든 상관이 없지만, 스페큘러(정반사)는 카메라가 어느 위치에 있는지 중요하다.
  • 하이라이트를 볼 수 있는 영역은 그림과 같이 r을 중심으로 한 원뿔 모양으로 묘사할 수 있다.

 

원뿔 속에서 하이라이트가 감소되는 정도는 다음과 같이 근사적으로 계산된다.

 

  • 여기에서 sh는 shininess의 앞 글자로 표면의 매끈함의 정도를 나타낸다.
  • r과 v가 같으면 sh값에 관계없이 1이 되고 최대의 하이라이트가 카메라에 보인다. 하지만 r과 v가 다르면 sh가 커질수록 하이라이트는 급격히 감소하게 된다.

 

스페큘러 항

 

  • 여기서 s_s는 광원의 색상이고, m_s는 물체의 스페큘러 계수(specular reflectance)이다. 디퓨즈와 마찬가지로 max함수가 필요하다.
  • m_s는 m_d와 달리 (0.9, 0.9, 0.9), (0.8, 0.8, 0.8) 등과 같은 회색조(gray-scale)로 표현되는데, 이는 물체 표면의 하이라이트가 광원의 색을 반영하도록 하기 위함이다.
    → 예를 들어 빨간색의 금속성 물체에 흰색 광원이 비치는 경우를 상상해 보자. 물체 표면이 빨간색이더라도 하이라이트 영역은 흰색으로 빛날 것이다.
  • 따라서 m_s는 회색조로 설정되어, s_s가 반사되는 정도를 조절하게 된다.

 

스페큘러 항에 의해 렌더링된 주전자

 

  • 다음 그림의 주전자는 스페큘러 항에 의해서만 렌더링되었다.

 

 

 

 


 

 

 

 

출처

[OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문]을 보고 공부하고 정리한 내용입니다.

 

 

 

 

 

 

728x90