이번 내용은 LearnOpenGL에서의 내용과, 이미지를 사용하여 적어보겠습니다.

실생활의 조명은 매우 복잡하지만, OpenGL에서의 조명은 처리되기 쉽고 실제 사물과 비슷하게 보이는 모델을 사용하여 실제에 대한 근사치를 기반으로 이뤄져 있다. 사실 빛이 반사되는 모든 경우를 계산해서 정점의 색을 결정한다면 표현할 수 있겠지만, 그럴 수 없기 때문이다.

Flat Shading

  • 기본적인 Shading으로 하나의 Primitive를 하나의 색으로 채우는 방식이다.
  • Primitive마다의 색이 다르기 때문에 색이 있는 폴리곤을 보는 느낌이 들 수 있다.

Gouraud Shading

  • Primitive의 정점에 대해 색상을 부여하여 색상을 보간하여 채우는 방식이다.
  • Flat Shading보다는 자연스럽게 표현되지만 어딘지 모르게 부자연스러운 느낌이다.

Phong Shading

  • Primitive의 채워지는 Pixel에 대해 색상을 계산하여 채운다.
  • Pixel마다의 빛을 고려했기 때문에 자연스럽게 계산된다.


나는 Phong Lighting Model에 대해 적어보려 한다.(앞으로 이야기할 색의 범위는 [0~1]이다.)

Phong Lighting Model

  1. Ambient Lighting(주변광)
  2. Diffuse Lighting(분산광)
  3. Specular Lighting(반사광)

Ambient Lighting

아무리 어두운 곳에 있더라도 어디선가는 빛이 있다.
빛은 여러 방향으로 산란하여 퍼지기 때문에 어디 있을지 모르는 물체에 간접적인 영향을 준다.
하지만, 얼마나 영향을 받을지는 모르기에 사용자가 정한다.

결과적으로, Ambient 상수, 빛의 색, 물체의 색을 곱한 값이 된다.


Diffuse Lighting

빛과 물체의 관계에 따른 물체의 기본적인 색을 결정하는 데 사용된다.

광원에서 정점까지의 빛을 법선 벡터와 정점의 평면벡터로 나누게 되면 해당 값이 나오는데 이를 내적으로 계산한다.
즉, 빛의 세기가 1이라고 했을 때 법선 벡터 방향의 빛의 세기라고 볼 수 있다.

광원에서 정점까지의 벡터를 L, 정점의 법선 벡터라 했을 때, 내적 $(-L) \cdot N = |L||N|cos\theta = cos\theta$
여기서 만약 내적 값이 0보다 작다면 앞면이 아니기 때문에 그리지 않아도 된다.


Specular Lighting

빛과 물체 그리고 카메라의 관계에 따른 빛에 의해서 강조되는 부분을 표현하는 데 사용한다.

광원에서 정점까지의 빛을 정말 반사했을 때의 벡터, 카메라의 위치에서 정점까지의 벡터를 내적 한 값을 n제곱을 하면 된다.

위에서 Diffuse에서처럼 내적 값이 0보다 작다면 앞면이 아니기 때문에 그리지 않아도 된다. (0 처리하면 됨)

여기서 n제곱을 하는 마지막 과정이 있는데, 이는 우리가 반사된 빛을 얼마나 똑바로 보고 있는가를 판단하는데,
해당 값의 범위가 [0~1] 사이인데, 이 값을 n 제곱하면서 1과 가까운 값만 유효하게 쓸 수 있도록 해준다.
여기서 n의 값이 크면 클수록 유효한 범위가 작아지는 것을 알 수 있다.

'OpenGL' 카테고리의 다른 글

Texture Coordinate  (0) 2022.11.14
Normal Vector의 변환 행렬  (0) 2022.11.14
OpenGL[Coordinate System]  (0) 2022.10.18
OpenGL[02](First Triangle)  (1) 2022.10.12
OpenGL[01](Shader)  (1) 2022.10.12

+ Recent posts