Chapter 1 : 폴리곤 메쉬

코승호딩·2022년 9월 15일
0

게임수학

목록 보기
1/3
post-thumbnail

📌표면 법선벡터

정점의 정보에는 포지션 좌표 뿐만 아니라 법선이라고 하는 정보 즉, 법선 벡터들이 정점에 저장이 되어야 할 필요가 있다. 표면의 법선 이라고 하는 것은 세 개의 꼭짓점을 가지면 법선을 계산할 수 있다. 오른손 좌표계일 경우 엄지를 첫 번째 벡터, 검지를 두 번째 벡터라 하였을 때, 세 번째 손가락인 중지가 법선의 방향이 된다. 따라서 이를 외적이라 하며 그림과 같이 v1과 v2의 벡터가 있을 때, v1 x v2와 같이 외적으로 법선을 계산할 수 있다.


벡터의 외적


벡터의 외적은 위 사진과 같은 방식으로 구할 수 있다. 그러나 이러한 복잡한 계산 공식 자체는 외울 필요 없이, 벡터의 외적 연산에서 두 벡터의 외적의 결과에 해당하는 방향을 기하학적으로 이해를 할 수 있으면 된다.


폴리곤의 정점 나열

폴리곤의 정점을 나열하는 순서가 시계 방향(Clockwise:CW)일 수 있고 반시계 방향일 수 있는데, OpenGL에서는 반시계 방향으로 나열을 하며 Direct3D에서는 시계 방향으로 나열한다.

위 그림과 같이 t1은 p -> q -> r의 순서로 반시계 방향으로 나열 되며 오른손 좌표계를 사용 시 구의 바깥쪽을 향하는 법선 벡터를 얻을 수 있다. 이러한 각각의 법선을 정점의 정보들로 표현하여 버텍스 셰이더에서 사용을 하거나 픽셀 셰이더에서 조명 계산을 할 때 법선을 이용할 수 있다.


smooth surface


위 그림의 구와 같은 메쉬를 표현하기 위해서 실제로는 polygon mesh처럼 작은 폴리곤으로 샘플링하여 표현한다. 부드러운 곡선을 처리하기 위해서는 연속적이며 부드러운 법선 벡터를 사용해야 한다. 그러나 이 법선을 폴리곤으로 처리를 하였을 때, 같은 폴리곤에 있는 법선들은 값이 같아지게 된다. 요약하여 우리가 원하는 것은 법선들이 연속적으로 달라지는 곡면의 형태를 원하지만 실제로는 다각형으로 근사하기 때문에 표면의 법선들은 모두 똑같아 지는 것이다. 이러한 상태로 조명을 계산하게 된다면 각이 지는 형태로 렌더링이 된다.
-> 그러면 어떻게 해야할까?
간단하다. 정점을 공유하는 주변의 모든 삼각형들의 법선 벡터를 평균으로 계산하는 것이다.


📌모델 내보내기와 불러오기


모델은 정점의 정보(vertex buffer)와 폴리곤을 표현하기 위하여 정점의 인덱스를 이용하여 삼각형의 모양을 표현하기 위한 인덱스 정보(index buffer)들이 포함된다. 그 밖의 애니메이션 정보, 텍스쳐 정보 등등 모델은 게임 프로그래밍에 적합한 형태의 파일로 저장한다.


내보내기(Export)

게임 프로그램에서는 모델이 갖고 있는 모든 정보가 필요하지는 않다. 또한 모델의 형식과 게임 프로그램의 데이터 형식이 다를 수 있다. 따라서 모델이 저장한 파일을 게임 프로그램이 직접적으로 읽는 것은 바람직하지 않다. 이와 같은 이유로 모델 툴에서 만든 데이터를 게임 프로그램 적합한 형식의 데이터 포맷으로 별도로 저장하는 과정이 바로 내보내기(Export)이다.
플러그인이나 스크립트, 3ds Max MAXScript와 같은 프로그램을 통해 데이터 포맷으로 별도의 형식으로 저장할 수 있다.


불러오기(Import)

게임 프로그램에 적합한 형태로 포맷된 파일을 읽어 들이는 것이 가져오기(Import)이다.


📌Post-transform Cache

폴리곤이 존재한다면 vertex buffer와 index buffer가 존재할 것이다. 이 때, vertex buffer의 정점들은 GPU에서 셰이더를 통해 처리가 된다. 그 결과는 캐쉬라는 GPU 내부의 메모리에 저장이 되고 index정보를 사용하여 삼각형들을 조립을 할 때, 파이프라인에서 캐쉬에 저장되어 있는 정점 데이터들을 재사용을 하게 된다. 따라서 정점에 대한 transform은 한번만 일어나게 된다.


작은 캐쉬 크기

만약 캐쉬가 작으면, 모든 정점의 처리 결과를 캐쉬 메모리에 저장을 할 수 없어 필요한 정점 데이터가 캐쉬에 있을 수도 있고 없을 수도 있다. 만약 없다면 다시 transform을 해서 캐쉬에 저장을 해야한다. 따라서 GPU에 캐쉬는 매우 중요한 역할을 담당한다.


ACMR

Average Cache Miss Ratio란 삼각형 당 처리되는 정점의 평균 개수로 작을수록 좋다. 캐쉬 메모리에 원하는 인덱스의 정점 데이터가 없다면 캐쉬 미스라고 한다. 폴리곤들을 조합할 때 한 폴리곤의 정점을 다른 폴리곤에서도 재사용하여 재구성을 할 수 있다면 ACMR이 더 좋아질 수 있을 것이다. ex) 삼각형 재정렬 알고리즘


📌Triangle Strip


다각형 메쉬를 표현할 때, 마지막 정점 두 개와 새로운 삼각형의 정점을 사용하여 새로운 삼각형이 만들어지는 형태로 데이터를 나열한 것이 삼각형 스트립이다. 따라서 첫 번째 삼각형은 제외하고 나머지 삼각형은 이전 삼각형의 2개의 정점을 공유한다.


📌Coordinate System


첫 번째 엄지가 x축이 되고 두 번째 검지가 y축, 세 번째 중지가 z축이 되는 좌표계이다. 손가락이 말리는 방향이 +이다. 회전의 중심은 z축이다. 여기서 회전 방향이 헷갈릴 수 있는데 각각 따봉을 하였을 때 말려 들어가는 쪽이 회전 방향이다. 따라서 오른손 좌표계(RHS)는 시계방향, 왼손 좌표계(LHS)는 반시계 방향의 회전 방향을 갖는다.
노멀은 외부를 향하게 만드는 것이 일반적인 표현 방법이다. 우리는 면을 봐야하기 때문에 바깥쪽을 향해야만 한다. 정점 또는 인덱스를 나열할 때, 나열 순서를 Winding order라고 하는데 이 와인딩 오더는 시계 방향일 수 있고 반시계 방향일 수 있다. 오른손 좌표계인 경우 반시계 방향으로 회전하기 때문에 CCW에 해당하고 왼손 좌표계인 경우 시계 방향으로 회전하기에 CW라 부른다. 따라서 각각의 와인딩 오더는 다음 for RHS와 for LHS로부터 살펴볼 수 있다. 모델과 게임 프로그램의 좌표계는 모두 다를 수 있기 때문에 Export를 할 때 서로 좌표계를 맞춰야 한다.

RHS에서는 반시계 방향인데 만약 LHS에서 이 와인딩 오더를 그대로 사용한다면 두가지 문제점이 생긴다.
1. LHS에서는 CW로 시계 방향이 보이는 면이지만, RHS의 와인딩 오더는 CCW이기 때문에 안보인다고 생각하여 그리지 않게 된다.
-> 정점의 순서 와인딩 오더를 바꿔주는 작업이 필요하다.
2. z축의 방향이 서로 반대이기 때문에 모델의 좌우가 바뀌며 좌우 대칭이 된다.
-> 모든 z좌표에 -를 붙여 -z를 만들어 준다.


Conversion RHS, LHS


앞서 나온 문제점을 해결하기 위해 RHS와 LHS간 포팅을 해야하는데 이를 위해 2가지 리모델링 작업을 해야한다.

정점 재정렬 : CCW <p1, p2, p3> -> CW <p1, p3, p2>
z 좌표 부호 변경 : 모든 z좌표에 - 를 붙여준다.

이 과정은 모두 Export과정에서 할 수 있다.
이처럼 z좌표 부호 변경은 필수이지만, 정점 재정렬은 피할 수 있다. Culling 설정을 통해 점면인지 은면인지의 의미를 바꿔줄 수 있기 때문에 필수는 아니다.0

profile
코딩 초보 승호입니다.

1개의 댓글

comment-user-thumbnail
2022년 9월 15일

모든 내용은 한국공학대학교 이용희 교수님 게임수학ppt 자료를 통해 정리됩니다. 계속 업로드 될 예정입니다

답글 달기