센로그

1. Modeling 본문

게임/그래픽 프로그래밍

1. Modeling

seeyoun 2023. 3. 14. 14:00

◆ Polygon이란?

3차원 메쉬의 정보를 표현하는 데 쓰이는 기본 단위

평면(plane) 위에 표현되는 기본 도형들.

ㆍ보통 게임 그래픽에서는 삼각형 폴리곤을 많이 사용함.

※ but, 무조건 삼각형은 아님!
삼각형(triangle polygon)은 연산이 빠르지만, 빛 계산이 어려울 수 있음(→ 게임에서 주로 사용)
사각형(quad polygon)은 연산이 좀 느리지만, 빛 계산 정확히 할 수 있음(→ 영화에서 주로 사용)

 

ㆍ폴리곤의 크기 작을수록 정교하고 부드러운 메쉬 표현 가능

 


Polygon Mesh의 특징

Typical closed mesh(구멍이 없는 mesh)의 경우,일반적으로 트라이앵글 개수 = 정점의 개수 * 2 정도이다.

< 예시 >

삼각형 메쉬의 꼭짓점을 v(vertex), 모서리를 e(edge), 한 삼각형 면을 f(face)라고 하자.

v =4, e = 6, f = 4 이므로 v - e + f = 2 이다.

 

두f는 하나의 e를 공유하고, 모든 f는 e를 세개씩 가지고 있다.

따라서 3개의 e마다 2개의 f가 추가됨. (총 개수 기준)

즉 f : e = 2 : 3 이므로 2e = 3f 이다. (e = (3/2)f)

 

이제 위 식에 e = (3/2)f를 대입해주면, f = 2v - 4가 나온다.

따라서 v, e, f가 큰수일 때 상수인 4를 무시하면 f ≒ 2v라 할 수 있다.

 

 

< octahedron(팔면체) 인 경우 >

 


■ LOD (Level Of Detail)

사용자 시점으로부터 거리에 따라 mesh의 정밀도와 해상도를 단계적으로 표현하는 기술
(정밀도(accuracy)와 효율성(efficiency) 사이의 절충점을 찾아서(tradeoff), 가장 효율적으로 그럴듯하게 하기위한 기술)

polygon mesh의 vertex 개수 resolution(해상도) 또는 LOD에 의해 설명됨.

resolution이 증가할수록, 원래의 부드러운 표면과 유사해지는 대신, 더 많은 처리 시간이 필요해짐.

 


◆ GPU (Graphics processing unit)

그래픽처리를 위한 고성능의 처리장치

general-purpose(일반적인 여러 목적)를 가진 CPU와 다르게,

GPU그래픽 처리의 목적을 가지고 있으므로 병렬 처리에 특화되어 있음(병렬 구조) => 효율적인 렌더링 가능

 

그림을 보면, CPU는 한번에 한 코어가 돌아가고 GPU 한번에 여러 코어돌아감

이처럼 CPUmulti-core(일반적으로 2-8개 코어)이고, GPUmany-core(일반적으로 수십~수백개 코어)이다.

 

 

GPU OS가 올라가지 않음!!

따라서, CPU가 과제를 정리해서 (data bus를 통해) GPU에게 전송해 일을 시키고

다시 GPU로부터 결과물을 받아서 처리하는 구조로 동작함. 

=> 그 과정에서 data bus가 충분한 속도로 교환을 해줘야 한다는 이슈가 있음. LOD 기술을 활용해 시간을 줄이기도 함!

 


Polygon Mesh의 표현법

explicit way 로 표현함

예를들어, 구를 표현하기 위한 방법으로 아래의 두 가지가 있다.

 

  • implicit(함축적인) way : 도형을 수학적(수식)으로 표현하는 방법
  • explicit(명백한) way : 도형이 가진 폴리곤 각각의 정보를 다 표현하는 방법. <= Polygon Mesh의 표현법

 


Polygon Mesh의 표현
: LHS vs RHS representation

LHS(Left Hand Side; 왼손 좌표계)

왼손 방향으로 좌표 저장. Direct X에서 사용

RHS(RightHand Side; 오른손 좌표계)

오른손 방향으로 좌표 저장. OpenGL에서 사용

 

LHSRHSz값의 방향(엄지손가락 방향이며, 보이는 방향이 됨)이 다름!!

따라서 좌표계에 따라 다른 순서로 정보를 저장해야 함.

더보기

현재 내 위치에서 삼각형이 보이려면, 내 쪽으로 z가 뻗어잇어야 함. 

양손으로 나자신을 가리키면서 돌려보면, LHS는 CW, RHS는 CCW방향임을 알 수 있음.

 


Polygon Mesh의 표현
: Non-indexed vs Indexed representation

■ Non-indexed representation

모든 좌표를 일일이 저장해서 사용하는 방법

=> 모든 좌표를 일일이 저장하기 때문에, 자료 양이 크다는 단점. (반복되는 것도 일일이 다 적음)

 

■ Inexed representation

좌표를 array에 넣어놓고, 실제 사용할 때는 array에서 해당 좌표의 index만을 갖고와서 쓰는 방법

 

=> 자료 양에 대한 이슈 해결! 요즘은 보통 이걸 씀 ㅇㅇ

 

< 예시 >

엄지손가락(z축 방향)이 바깥 면으로 나오게 한 다음, 각자 방향(LHS, RHS)대로 돌면서 적어주면 됨

우리는 바깥 면을 봐야 하기 때문!

 


◆ Normal Vector (법선 벡터)

어떤 점에서, 이 점에 접하는 면(tangent plane)과 perpendicular(수직)한 방향으로 나가는 벡터

normal과 light가 이루는 각에 의해서 물체 표면에서의 빛 표현이 결정됨

 

※ 단, 여기서의 빛 표현은 shadow랑은 연관 없음!
이 mesh의 위치 정보와 local light만 고려했을 때의 색깔이라는 것을 기억해야 함.
왜냐하면, GPU는 병렬로 처리하기 때문에, 옆 코어를 참조할 수 없어서 다른 광원을 고려할 수 업슴
=> 다른 mesh들과 다른 light들이 어떤지는 알 수 없다는 뜻.

따라서 완전히 독립적으로 이 mesh에 관한 것만 계산한 것임.

 


◆ Normal Vector - Triangle Normal

Triangle 면에서의 normal vector. 
Vertex normal을 구하기 위한 선행 작업!

한 vertex에서 바로 normal을 구하긴 어려움

따라서 triangle 면에서의 normal을 먼저 구하기로 함~

 

vertex의 위치만 있으면 외적을 통해 triangle normal을 구할 수 있음!

세 개의 vertex를 가지고 두 개의 벡터를 만들어서 외적(cross product) 해주고, 단위벡터로 만들어주면 됨.

 

normal vector는 vertex들의 저장 순서(CW or CCW; 어느 좌표계를 쓰는지)에 따라 다른 방향으로 나올 수 있음.

polyhedron(다면체)의 바깥 방향을 가리키도록 해야함!

 


◆ Normal Vector - Vertex Normal

Vertex에서의 normal vector.
주변 triangle normal들의 평균

(한 vertex에서 바로 normal을 구하긴 어려우므로) 그 vertex를 공유하는 주변 triangle 들의 normal을 구해서 평균

Vertex Normal은 보통 vertex array를 통해 CPU에서 GPU에게 전송되는 데이터임.

 


◆ Polygon Mesh 의 Export와 Import

Polygon mesh들의 관련 데이터들은 파일(.obj 등)에 저장되어 런타임 3D 애플리케이션으로 넘어감.

  • Export : 다른 애플리케이션의 형식에 맞도록 하여 데이터를 내보내는 과정
  • Import : export된 데이터를 내 애플리케이션에 불러오는 과정

 

파일에 저장된 데이터는 내 애플리케이션에서 vertex, index array로 import할 수 있음.

 

※ 참고
Export시 array는 1부터 시작 ← 디자이너들을 위한 툴이기 때문
Import시 array는 0부터 시작 ← 프로그래머들을 위한 툴이기 때문

이런 사소한 차이로부터 버그 발생하곤 함!
Comments