앞서
이 포스팅은 홍정모의 그래픽스 Part1을 수강하고 작성한 내용입니다.
강의의 세부 코드는 첨부하지 않고, 결과와 이론 위주로 포스팅했습니다.
개요
현재까지의 레이트레이싱은 각 픽셀에서 z축 방향으로(vec(0.0f, 0.0f, 1.0f 방향으로) 빛을 쏴줬기 때문에 원근감이 없다.
위의 구 3개는 반지름이 모두 같지만 파란색이 제일 뒤, 초록색이 가운데, 빨간색이 제일 가까이에 있다.
위 그림에는 2개의 문제점이 있는데
1. 원근감이 없기 때문에 세 구의 크기가 같아 보인다.
2. 파란색 구가 제일 뒤에 있고, 빨간색 구가 제일 앞에 있지만 렌더링할 때 이를 고려하지 않아서 초록색이 파란색, 빨간색이 초록색과 파란색에 가려지게 된다.
이 2가지 문제점을 해결해 볼 것이다.
원근감 주기
위에서 말한 것처럼 픽셀에서 z축 방향으로 방향벡터를 쏘기 때문에 별 차이가 없어 보이는데, 원근감을 구현하려면 시점을 넣어야 한다. 즉, 관측하는 우리의 눈 위치가 잡혀야 한다.
그래서 픽셀에서 z축 방향으로 방향벡터를 쏘는 게 아니라, 눈에서 픽셀까지의 벡터를 계산해서 픽셀에서 이 벡터의 방향벡터 방향으로 Ray를 쏴주면 원금감을 구현할 수 있다.
여기에서의 눈 위치는 x, y축으로는 0.0f, z축 방향으로는 화면 앞 방향(구의 반대방향)으로 조금 당겨주었다.
원근감 결과
눈 위치를 지정하고, 화면에서 쏘는 Ray의 방향을 바꿔주니 위 이미지처럼 원근감이 잘 구현된 걸 볼 수 있다.
다만 아직 원근에 따른 렌더링 우선순위가 지정되어 있지 않아 먼저 생성된 파란색 -> 초록색 -> 빨간색 순으로 구가 그려지는 모습을 볼 수 있다.
레이 충돌 로직 조절
코드에서는 vector<object>에 파란색 초록색 빨간색 순으로 넣어줘서 깊이와 상관없이 먼저 넣어준 순서 대로 화면에 출력되었다.
Ray의 충돌을 계산할 때 vector에서 제일 먼저 충돌한 object를 반환하는 것이 아닌, 모든 object를 순회하면서 깊이에 따라 비교를 진행해, 더 가까이에 있는 obejct를 반환하도록 수정해 주었다.
다만, 이렇게 모든 object에 대해서 검사하는 것은 매우 느린 작업이기 때문에, 추후에 배우는 래스터라이즈 단계에서 최적화를 더 진행한다고 한다.
충돌 로직 수정 결과
거리가 가까운 구부터 먼저 그려져서, 더 깊이 있는 구가 앞에 있는 구에 정상적으로 가려지는 모습을 확인할 수 있다.
'CS > 그래픽스' 카테고리의 다른 글
[홍정모의 그래픽스 새싹코스 Part1] 그림자 넣기 (0) | 2023.12.10 |
---|---|
[홍정모의 그래픽스 새싹코스 Part1] 삼각형 그리기 (0) | 2023.12.09 |
[홍정모의 그래픽스 새싹코스 Part1] 퐁 쉐이딩으로 구 만들기 (1) | 2023.12.07 |
[홍정모의 그래픽스 새싹코스 Part1] 구 만들기 (0) | 2023.12.06 |
[홍정모의 그래픽스 새싹코스 Part1] 원 만들기 (0) | 2023.12.05 |