게임/게임 그래픽 구현

[그래픽] 1. 삼각 폴리곤 렌더링 원리 이해하기

허브포트 2020. 1. 4. 15:10

 

 

포켓몬을 했다면 친숙한 폴리곤, 이 폴리곤을 이루고 있는 삼각 폴리곤에 대해 알아볼 것이다. 실제로, 이 삼각 폴리곤은 소프트 웨어로 그리는 상황은 거의 없다.  하지만 삼각 폴리곤을 렌더링 하는 원리를 이해하는 것이 중요하다.

 어떻게 해야 삼각 폴리곤을 효율적으로 그릴 수 있을까? 3D 그래픽에 사용하는 삼각 폴리곤은 3개의 변뿐만 아니라 삼각형의 내부 면도 전부 그려야 한다. 이런 도형을 효율적으로 그리려면 스캔 라인 알고리즘으로 그리면 된다. 삼각형을 세로로 한 줄씩 나누고 가로 일직선으로 분해한 후 그 선분을 위에서부터 차례대로 그리는 것이다.

그림1-1

위의 그림처럼 삼각 폴리곤을 만들면 된다.

 

이렇게 하는 이유는 컴퓨터의 VRAM(video ram)에서는 화면에 표시되는 가로 일직선을 주로 연속된 주소에 저장하므로 연속된 주소 영역에 차례로 기록하면 속도 효율 면에서 가장 좋기 때문이다.

 

그래서 이런 삼각형을 한 줄씩 분해해보자

 

y좌표가 작은 순으로 나열한 꼭짓점을 각각 꼭짓점 1, 꼭짓점 2, 꼭짓점 3이라고 할 때, 그리려는 삼각형은 보통 꼭짓점 2의 Y좌표를 경계로 다음과 같이 삼각형 2개로 나눌 수 있다.

 

1. 꼭짓점 2위에 있고 밑변이 x축과 평행인 삼각형

2. 꼭짓점 2 아래에 있고 한 변이 x축과 평행인 삼각형

 

이렇게 2개로 삼각형을 나누면 왼쪽 변에서 오른쪽 변을 향해 가로로 직선을 그리기만 하면 삼각형을 그릴 수 있다.

그리고 또 두 가지의 경우로 나누어야 한다.

 

<꼭짓점 2가 오른쪽에 올 것인가, 아님 왼쪽에 올 것인가.>

 

<꼭짓점 2가 오른쪽에 오느냐 왼쪽에 오느냐>에 따라서 삼각 폴리곤을 그리는 방법이 달라지므로 두 가지 경우로 나누어 주어야 한다.

 

1) 꼭짓점 2가 왼쪽에 오는 경우

타입1

꼭짓점 1, 2, 3을 A, B, C라고 하고 마주 보는 대변을 a, b, c라고 한다.

 

B가 왼쪽에 오는 삼각형에서

-위쪽 삼각형은 왼쪽 끝이 선분 c, 오른쪽 끝이 b인 가로 직선을 그려 가면 된다.

-아래쪽 삼각형은 왼쪽끝이 선분 a, 오른쪽 끝이 b인 가로 직선을 그려 가면 된다.

2) 꼭짓점 2가 오른쪽에 오는 경우

꼭짓점 1, 2, 3을 A, B, C라고 하고 마주 보는 대변을 a, b, c라고 한다.

 

B가 오른쪽에 오는 삼각형에서

-위쪽 삼각형은 왼쪽끝이 선분 b, 오른쪽 끝이 선분 c인 가로 직선을 그려 가면 된다.

-아래쪽 삼각형은 왼쪽 끝이 선분 b, 오른쪽 끝이 선분 a인 가로 직선을 그려 가면 된다.

 


(꼭짓점 1, 2, 3을 A, B, C라고 하고 마주 보는 대변을 a, b, c라고 한다.)

 

삼각 폴리곤을 그리기 위해서는 우선 a, b, c의 기울기를 구해야 한다.

 

A = (x3, y3)

B = (x2, y2)

C = (x1, y1)

 

a_I = (x2 - x1) / (y2 - y1)   # 선분 BC

b_I = (x3 - x1) / (y3 - y1)   #선분 AC

c_I = (x3 - x2) / (y3 - y2)   #선분 AB

 

 

꼭짓점 B가 왼쪽에 있다는 것은 선분 b보다 왼쪽에 위치한다는 것이고,

꼭짓점 B가 오른쪽에 있다는 것은 선분 b보다 오른쪽에 위치한다는 것이다.


 

1) B가 선분 b보다 왼쪽에 오는 경우에서 삼각 폴리곤 그리기

xl = x1 (xl은 xleft, xr은 xright)

xr = x1

y를 A부터 C까지 감소시킨다.

X를 A부터 시작하여 변 c, a를 따라 오른쪽으로 직선을 뻗는다.

y가 한칸 내려올 때마다

xl = xl + c_I

xr = xr + b_I

 

현재 y좌표가 B에 도달했을 때

xl = xl + a_I

xr = xr+b_I

1) B가 선분 b보다 오른쪽에 오는 경우에서 삼각 폴리곤 그리기

xl = x1(xl은 xleft, xr은 xright) 

xr = x1

y를 A부터 C까지 감소시킨다.

X를 A부터 시작하여 변 b 를 따라 오른쪽으로 직선을 뻗는다.

y가 한 칸 내려올 때마다

xl = xr + b_I

xr = xl + c_I

 

 

현재 y좌표가 B에 도달했을 때

xl = xr+b_I

xr = xl + a_I