ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [컴퓨터 그래픽스] Lighting
    컴퓨터그래픽스 2024. 2. 16. 13:49

    저번 포스팅에서 다뤘던 image texturing의 연장선의 내용이다. 래스터라이저에서 fragment을 정의해 넘겨주면 프래그먼트 쉐이더에서 텍스처링, 라이팅을 했다. 저번 시간엔 텍스처링에 대해서 다뤘고 이번 시간은 라이팅 이다.

    ​

    1. 퐁(Phong) 라이트닝.

    ​

    이름이 참 귀엽다.. ㅋㅋ

    퐁 라이트닝을 위해서는 먼저 광원이 정의된다. 말 그대로 빛이 나오는 지점(like 태양)이다. 광원은 점이고, 빛을 받아들이는 물체는 점이 아니기 때문에 물체 표면으로 들어오는 빛은 그 길이가 각각 미세하게 다르다. 하지만 그 차이는 거의 무시할만 하다. 그렇기 때문에 물체 표면에 들어오는 여러 방향의 빛은 서로 평행하다고 가정히는데, 이러한 광원을 방향성 광원(directional light source)이라 한다.

    ​

    ​

    퐁 모델은 4개의 항으로 구성되어 있다. 디퓨즈(diffuse), 스페큘러(specular), 앰비언트(ambient), 발산광(emissive light)이다.

    ​

    ​

    1-1 디퓨즈 항 - 난반사

    • 디퓨즈 항은 램버트의 법칙을 따른다.

    램버시안 표면 (= 디퓨즈 표면) 이라는 것이 램버트의 법칙에서 정의되는데, 이는 어느 방향에서 빛이 들어오던간에 모든 방향을 따라 같은 강도로 반사되는 표면을 말한다.

    먼저 그림을 보면, n은 물체의 normal이고, l은 물체 표면으로 들어오는 빛의 반대방향을 가지는 단위벡터이다. n과 l을 내적하여 빛의 양을 구할 수 있다. 만약 내적값이 음수면 빛이 들어오지 않는 것이므로, max 함수를 써서 양수의 값만 받도록 한다.

    ​

    max(dot(n, l), 0) 은 빛의 강도만 결정한다. 색상을 정의하는 부분은 다음과 같다

    S는 광원의 RGB, M은 물체의 디퓨즈 계수이다. 예를들어 흰색 광원은 RGB가 모두 1이므로 S는 (1,1,1)의 값을 갖는다. 물체의 M이 만약

    (1,0,0)이라면 내적 결과가 (1, 0, 0)이 될 것이다. 이는 광원의 RGB중 G와 B가 흡수되고, R만이 반사되어 우리 눈에 들어오게 됨을 뜻한다.

    디퓨즈 항에선 최종적으로 위와 같은 식을 사용하게 된다.

    ​

    1-2 스페큘러 항 - 정반사

    스페큘러 항은 물체 표면에 음영(하이라이트)를 만드는 데 사용된다. 이를 위해 시선 벡터(view vector)와 반사 벡터(reflection vector)가 정의된다.

    ​

    시선벡터는 물체와 카메라를 연결하는 벡터(v), 반사벡터는 입사각 반사각의 원리에 기반한 벡터 (r)이다.

    벡터 r은 위 식과 같이 정의할 수 있다. 시험때 나와서 저 2 * n * dot(n, l) - l 식을 달달 외웠었다. 이해하면 외울필요 없지만 외우면 시간 단축이 된다!

    ​

    r과 v 사이의 각을 p라고 하면, p가 0일때 최대의 하이라이트(반사광)을 볼 수 있다. 또한 반사광은 표면의 매끄러움 정도에 따라 달라지는데 이를 다 반영한 식은 다음과 같다.

    sh는 표면의 매끄러움 정도이며, shininess의 약자이다. S(s)는 일반적으로 디퓨즈 항에서 사용한 S와 동일하다. 그러나 M(s)는 M(d)와 다르다. M(s)는 대부분 (0.n, 0.n, 0.n)과 같은 회색조로 표현되는데, 이는 하이라이트가 광원의 색을 잘 반영하도록 하기 위함이다. n의 값이 달라지면 반사되는 강도가 달라지게 된다.

    스페큘러 항만 이용해 랜더링한 결과이다. 다음과 같이 거의 검은색을 띄는 주전자에 흰색 하이라이트(s의 값이 모두 1 이란 것은 흰색 광원을 의미)가 생긴 것을 확인할 수 있다.

    ​

    ​

    ​

    1-3 앰비언트 항

    공간 내 다양한 물체들 또한 빛을 반사한다. 다른 물체로부터 들어온 모든 빛은 모든 방향으로 반사가 된다.

    다양한 곳에서 들어온 빛이 다양한 방향으로 반사된다는 원리는 p의 normal이 필요 없다는 의미를 내포한다. 때문에 앰비언트 항의 식은 위와 같이 간단히 정의된다. S(a)는 앰비언트 빛의 RGB 색상이고, M(a)는 물체의 앰비언트 계수이다.

    ​

    1-4 발산광

    물체 자체에서 나오는 빛이다. 책에서는 심오하게 다루진 않지만, 게임을 제작하다보면 빛을 발산하는 물체를 만들 일이 아주 많을 것이기에 소홀히 하고 넘어갈 수 없다. 발산광의 개념에서 퐁 모델의 한계점이 드러난다. 아까 광원의 개념을 정의할 때 빛을 발산하는 물체라 했다. 실제와 같은 빛 반사를 구현하려면 당연히 발산광을 가진 물체 또한 광원으로 설정하여야 한다. 그러나 퐁 모델은 발산광을 가진 물체를 광원으로 취급하지 않는다. 따라서 같은 공간의 다른 물체를 라이팅하는 데 기여하지 못하는 것이 퐁 라이트닝의 한계이다.

    ​

    ​

    네 개의 광을 다 합친 식은 다음과 같다.

    각각의 M 값들은 사용자가 직접 설정할 수 있다. 나타내고자 하는 물질의 재질에 따라 적절한 값을 설정하면 된다.

    ​

    그림을 통해 나타낸 것이다. 퐁 라이트닝은 정말 신기한 방법이지만 근래에는 거의 쓰이지 않는 기법이다. 킹갓 Ray tracing이 있기 때문이다. 나중에 자세히 다룰 것이다.

Designed by Tistory.