CS/그래픽스

[홍정모의 그래픽스 새싹코스 Part1] 원근감 만들기(Perspective View)

겜도리도리 2023. 12. 8. 15:25
반응형

앞서

이 포스팅은 홍정모의 그래픽스 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에 대해서 검사하는 것은 매우 느린 작업이기 때문에, 추후에 배우는 래스터라이즈 단계에서 최적화를 더 진행한다고 한다.

 

충돌 로직 수정 결과

 

거리가 가까운 구부터 먼저 그려져서, 더 깊이 있는 구가 앞에 있는 구에 정상적으로 가려지는 모습을 확인할 수 있다.

반응형