이번 포스팅에서는 Point light, Spot light 에 대해 알아보겠습니다.
개요
재질만큼 중요한 조명에 대해 알아봅시다.
기본적으로 Directional light, Point light, Spot light가 있습니다.
Rasterization을 사용하는 Real-time graphics 에서는
사실성보다는 속도가 아주 중요했습니다. 즉, 그래픽 연산을 얼마나
적게해서 그럴 듯하게 만드냐에 초점이 있었습니다.
Directional light
태양같이 아주 멀리 있는 광원을 가정합니다.
광원은 아주 멀리있다고 정의하기 때문에 광선들은 서로 평행합니다.
Point light
Point Light는 점에서 사방으로 퍼져나가는 광원을 말합니다.
대표적으로 전구가 있고, 이 광원이 어디있는 지가 중요합니다.
광원이 움직이면 조명 효과도 같이 움직입니다.
물체가 조명으로부터 멀어지면 점점 어두워집니다.
점점 어두워지는 것을 수학, 물리적으로 푸는 것은 연산량이 많으므로
그렇게 중요한 요소는 아니었고, 멀어지는 현상이 느낌있게 되면 된다!
라는 것이였습니다.
위 그림에 falloffStart, falloffEnd 를 추가해서 d(거리)가 멀어질수록
어둡게 만들었습니다. 조명에 가까우면 1, 조명에 어두워질수록 0으로 설정해
빛의 세기를 조절했습니다.
이렇게 하면 멀리있는 조명은 신경안써도 되니 연산량을 아낄 수 있었습니다.
falloffStart, falloffEnd의 값은 레벨 디자이너가 이 값들을 수정할 수 있도록
만들어야 합니다. (기능 구현과 최적화 하는 방법, 최적화 등은 프로그래머가 하고
수정하는 방법만 알려주자)
Spot light
Spotlight 빛이 가는 방향에 있어 빛에 중심에서
가장자리로 갈수록 어두워지는 광원을 의미합니다.
무대같은 것의 집중을 시켜주는 빛들을 spotlight라고 합니다.
Spotlight는 Specular랑 아주 유사한데 그 이유는 SpotPower를 늘리면
한 점에 빛이 집중되고 낮추면 퍼지는 빛입니다.
그렇기 때문에 Specular랑 아주 유사한 형태의 빛입니다.
Spot light 도 Point light와 유사하게 falloffStart, falloffEnd의 거리를 측정해
빛을 구합니다.
요약하자면
Directional light 는 아주 큰 태양을 기준으로 하기 때문에 위치는 의미가 없고
빛이 들어오는 위치는 서로 평행합니다. 태양의 방향벡터만 있을 뿐입니다.
Point light는 방향이 없고 위치만 있어 퍼져나가는 광원입니다.
한 점에서 빛이 나기 때문에 위치벡터가 필요합니다.
또한, 빛의 세기를 조절해줄 falloffStart, falloffEnd 가 필요합니다.
Spot light는 특정 위치에서 특정 방향으로 퍼져나가는 광원입니다.
그렇기 때문에 위치, 방향 벡터가 필요합니다.
specular와 비슷한 성질을 가지고있어 빛의 크기도 필요하며
빛의 세기를 조절해줄 falloffStart, falloffEnd 가 필요합니다.
L = 조명의 위치 - 픽셀의 위치
d = length(L), d가 Light.falloutEnd 보다 멀면 적용 X
이전 포스팅에서 했던 것처럼 빛의 세기를 구하고
Attenuation을 해서 d, falloutStart, falloutEnd 로 해서
빛의 세기에 곱해주면 Point light 완성입니다.
마찬가지로 Spot light도 구하는데 -L 값과 Light.direction 값의 각도를 구해
Specular를 구합니다.
이렇게 해서 조명의 원리에 대해 알아보았습니다.
'컴퓨터 그래픽스 > Rasterization' 카테고리의 다른 글
Rasterization(9) - 블린-퐁 쉐이딩 (0) | 2024.07.28 |
---|---|
Rasterization(8) - 원근 투영 (0) | 2024.07.28 |
Rasterization(7) - 후면 추려내기 (0) | 2024.07.28 |
Rasterization(6) - 깊이 버퍼(Depth Buffer) (0) | 2024.07.27 |
Rasterization(5) - 위성 만들기 (0) | 2024.07.20 |