이 시리즈는 3차원 그래픽스에 대해 공부한 내용들을 담고 있습니다.
참고 자료 :게임 프로그래밍을 위한 3차원 그래픽스 (한정현, 홍릉과학출판사)
등
폴리곤은 유한한 직선으로 이루어진 다각형을 의미하며, 게임 그래픽스에서는 주로 삼각형의 폴리곤을 사용한다. 삼각형은 볼록성과 평면성을 모두 보장하여 처리 속도가 빠르다.
폴리곤은 vertex의 정보로 구성되며, 각 vertex는 좌표의 형태로 관리된다.
Direct3D : 삼각형 폴리곤만 사용하도록 제한.
OpenGL : 다각형 폴리곤 허용. 단, 볼록성과 평면성이 보장되어야 함.
3차원 컴퓨터 그래픽스 상의 객체는 다음과 같은 방법들로 표현할 수 있다.
f(x,y,z) = 0 형태의 음함수implicit function를 사용하여 표현하는 방법.
곡면 상의 점을 f로 표현할 수 있다.
각 vertex를 정확하게 표현할 수 있지만, 복잡한 형태를 표현하기는 힘들다는 단점이 있다.
폴리곤 메쉬가 지닌 정점vertex 등의 정보를 정의하여 표현하는 방법.
GPU가 폴리곤 메쉬 처리에 최적화되어 있어 실제 어플리케이션에서는 이 방법을 주로 사용한다.
그러나 폴리곤 메쉬의 각 vertex는 부드러운 곡면을 샘플링한 것에 불과하기 때문에, 부정확한 근사적approximate 표현이라는 단점이 있다.
메쉬의 폴리곤 수가 증가할수록 메쉬의 해상도resolution(혹은 LOD ; Level of detail)이 증가하지만, 그로 인한 비용 소모가 커진다. 다음은 메쉬의 해상도를 변환하는 작업을 지칭한다.
세분화(refinement)
: 저해상도 -> 고해상도
간략화(simplification)
: 고해상도 -> 저해상도
Closed mesh(hole이 없는 메쉬)에서 삼각형 폴리곤의 개수는 대략 vertex 수의 2배이다.
이는 복잡한 메쉬일수록 더욱 정확해진다.
- v - e + f = 2 (오일러 다면체 정리)
- 닫힌 메쉬에서 모든 삼각형의 각 모서리edge는 서로 공유되며, 각 면face은 세 개의 모서리를 가지므로 2e = 3f
- v - e + f = 2에 e = (3/2)f를 대입하면 v - (3/2)f + f = 2
=> f = 2v - 4
삼각형의 vertex 정보를 vertex buffer에 순서대로 저장하는 방법.
buffer에 중복되어 저장되는 좌표가 생겨 효율성이 떨어진다.
삼각형의 vertex 정보를 vertex buffer에 중복이 없게 저장하는 방법.
index buffer를 별도로 사용하여 각 index가 vertex buffer의 vertex를 가리키게 하고, 삼각형의 각 vertex를 index의 형태로 저장한다.
위와 마찬가지로 삼각형의 vertex 정보를 vertex buffer에 중복이 없게 저장하는 방법.
index buffer를 사용하지 않으며, 대신 렌더링을 위해 캐싱된 삼각형의 vertex 정보를 이용한다.
non-indexed representation에 비해 효율적이며 적은 데이터를 차지한다는 장점이 있지만, 일반적으로 indexed representation에 비해 효율성이 떨어진다.
노멀 벡터는 주어진 벡터에 수직인 벡터를 의미한다.
그래픽스에서는 조명Lighting이라 하는 '광원과 물체 표면 간 상호작용'에 중요하게 작용한다.
위 그림에서 삼각형 (p1, p2, p3)와 벡터 (v1, v2)가 도식되어 있는 것을 볼 수 있다.
이 때 삼각형 표면의 노멀(face normal)은 v1과 v2의 외적Cross Product를 통해 구할 수 있으며, 의 결과를 가진다.
컴퓨터 그래픽스에서는 모든 노멀을 단위 벡터로 표현하는 것이 원칙이기 때문에, 정규화를 수행하였다.
위 Surface Normal의 그림에서 노멀의 방향은 오른손 법칙에 따라 v1이 v2를 감싸는 방향일 때의 오른손 엄지손가락의 방향에 따라 정해져, 메쉬의 외부를 향하도록 정해졌다.
이 때 외부에서 표면을 바라보는 기준으로, 삼각형의 vertex 정보는 반시계Counter-Clockwise 방향으로 표현되어 있다. (p1 -> p2 -> p3)
만약 삼각형이 시계 방향Clockwise에 따라 (p1, p3, p2)의 형태로 정의되었다면, 노멀의 방향은 반대로 구해졌을 것이며 이는 메쉬의 내부를 향할 것이다.
즉, 오른손 법칙에 의해 반시계 방향으로 정렬된 정점은 물체 표면에서 바깥을 향하는 노멀을 생성하고, 시계 방향으로 정렬된 정점은 물체 안쪽을 향하는 노멀을 생성한다.
Direct3D는 LHS(Left Hand Side)를 사용하며, 시계 방향으로 좌표를 저장한다.
OpenGL은 RHS(Right Hand Side)를 사용하며, 반시계 방향으로 좌표를 저장한다.LHS와 RHS 간 포팅을 위해서는 두 가지 리모델링 작업이 수행되어야 한다.
1. 삼각형 정렬 순서의 변경
2. z좌표의 부호 변경 (xy 평면에 대한 반사)
정점의 노멀을 의미하며, 구하는 방법은 여러 가지가 있을 수 있다.
대표적인 방법으로는 해당 정점을 공유하는 삼각형들의 각 노멀의 평균으로 정의하는 방법이 있다.
사용하는 shading의 방법 등에 따라 하나의 vertex가 여러 개의 normal을 가질 수도 있으며, 같은 삼각형의 vertex라도 서로 다른 normal을 가질 수도 있다.
Flat shading : face normal에 따른 shading을 수행한다. 폴리곤이 단색으로 칠해지기 때문에 각진 메쉬가 생성되어 부드러운 표면을 표현하기 힘들다.
Smooth shading : vertex normal과 그에 따른 interpolation을 통해 shading을 수행한다. 물체의 곡선을 표현하기에 적합하다. 단, 물체의 각진 부분을 표현하기가 힘들어 이 경우 별도의 솔루션이 요구된다.
어플리케이션에서 만들어진 데이터(ex.3d 모델링 파일)를 다른 어플리케이션이 사용할 수 있는 형태(ex. obj 파일)로 내보내는 과정
이렇게 내보내진 파일에는 사용된 폴리곤의 vertex, face, normal, index 등의 정보가 저장된다.
어플리케이션에서 사용할 수 있는 데이터를 읽어오는 과정