CS/그래픽스

[홍정모의 그래픽스 새싹코스 Part2] 삼각형 레스터화

겜도리도리 2023. 12. 21. 18:25
반응형

앞서

이 포스팅은 홍정모의 그래픽스 Part2를 수강하고 작성한 내용입니다.

강의의 세부 코드는 첨부하지 않고, 결과와 이론 위주로 포스팅했습니다.

 

개요

 

까맣게 칠해져있는 화면이 있다. 이전에 레이트레이싱을 응용해서 그렸던 (https://gamedoridori.tistory.com/293) 삼각형을 이번엔 레스터화를  응용해 그려볼 것이다.

 

 

이전에는 시점에서 모든 픽셀 방향으로 Ray를 쏴 충돌한 오브젝트를 그려줬다. 하지만 이런 방법은 모든 픽셀을 순회해야 하고, 충돌한 오브젝트마다 거리를 비교해줘야 한다는  점에서 느리다. 따라서 이번엔 레스터화를 사용한다.

 

레스터화는  반대로 물체의 vertex에서 시점방향으로 Ray를 쏴준다. 그리고 스크린에 충돌한 지점을 기준으로 삼각형을 그리고, 각 픽셀이 삼각형 안에 있는지 판별한다.

 

vertex가 v0, v1, v2라고 하고 삼격형의 내부에있는지 외부에 있는지 판별할 점을 P라고 하자.

삼각형(v0, v1, P), 삼각형 (v0, v2, P), 삼각형 (v1, v2, P)의 넓이는 외적으로 구할 수 있다.

(v2- v1)과 (P - v1)의 외적을 S0, (v0 - v2)와 (P - v2)의 외적을 S1, (v1 - v0)와 (P - v0)의 외적을 S2라고 하자.

 

P가 삼각형 내부에 있을 조건은 S0, S1, S2의 값이 모두 양수일 때이다.

그리고 v0에서의 색깔을 R(1, 0, 0), v1에서의 색깔을 G(0, 1, 0), v2에서의 색깔을 B(0, 0, 1)이라고 했을 때 삼각형 내부의 점 P의 색상은 전체 삼각형 넓이에 대해 S0(R), S1(G), S2(B)의 크기비에 따라 결정된다.

 

또한 이 과정에서 최적화를 해줄 수 있다.

레이트레이싱에서는 광선을 쏘기 전까지는 물체와 충돌할지 알 수 없다. 그래서 모든 픽셀에 대해 충돌검사를 해줘야 했다.

한편 레스터화에서는 삼각형의 최소 x좌표값과 최대 x좌표값, 최소 y좌표값과 최대 y좌표값을 구한 뒤 이 영역의 내부의 픽셀만 검사하면 된다. 영역 밖의 픽셀은 당연히 삼각형의 외부이기 때문이다.

 

 

결과

먼저 삼각형의 World 좌표를 Raster 좌표로 바꿔줄 필요가 있다.

 

다음 첫 번째, 앞서 말한 삼각형의 최대최소 좌표를 이용해 Bounding Box 최적화를 먼저 진행한다.

 

외부 픽셀과는 상관없이, 이 영역 안에서만 삼각형 내부 판별을 해주면 된다.

 

두 번째, 외적을 통해 삼각형 내부 판별을 진행한다.

 

모두 양수일 때 만으로 조건을 걸어주면 삼각형을 그릴 수 있다.

마지막으로는 색상을 정해줘야 한다. 내부의 점 P로 만들어지는 작은 삼각형들의 넓이 비로 RGB 색상을 정해 줄 수 있다.

 

넓이비를 통해 RGB 색상을 잘 정해준 결과를 볼 수 있다.

반응형