본문 바로가기
코딩테스트 및 개인공부/3D 그래픽스(게임수학)

[1] 폴리곤 메쉬, 좌표계

by JJPearl 2022. 5. 30.
반응형

[Index]

- 폴리곤 메쉬

- 폴리곤 메쉬 표현 기법 : 삼각형 리스트, 삼각형 스트립

- 노멀 벡터

- 좌표계 : 오른손 좌표계, 왼손 좌표계

 


- 폴리곤 메쉬

  •  OpenGL
    임의의 수의 정점 갖는 폴리곤 처리 가능.
    모든 폴리곤은 볼록해야 하고(속도 때문에) 평평해야 한다(모든 정점들이 한 평면상에).
    이를 모두 보장하는 가장 간단한 폴리곤은 삼각형.
  • Direct3D
    처리할 수 있는 폴리곤이 삼각형으로 제한.

 GPU는 폴리곤 메쉬 처리에 최적화 되어있다. 

 폴리곤 메쉬의 정점들은 부드러운 곡면을 샘플링 한 점들에 불과.

 => 폴리곤 메쉬는 정확한 표현법이 아닌 근사적 표현법.

 폴리곤 메쉬의 해상도(resolution)가 올라갈 수록 곡면과 흡사해지지만 메쉬 처리 시간이 증가하여 효율성은 떨어짐.

 => 정확성과 효율성 사이 타협점 찾아야 함

 


- 폴리곤 메쉬 표현 기법

 삼각형 메쉬를 표현하는 방법

 

 1. 삼각형 리스트 : 세 개의 정점을 순서대로 나열 하는 표현법 
 - 인덱스 삼각형 리스트
  - 정점 버퍼: 정점들이 저장된 메모리 공간. 인덱스 삼각형 리스트에서는 정점들을 중복없이 저장.
   * 삼각형 메쉬에서 거의 모든 정점은 여러 개의 삼각형들끼리 공유된다. 효율적 메모리 사용 위해 정점들 중복 없이 저장.
   * 정점 버퍼에는 정점 위치 뿐 아니라 노멀(법선벡터), 텍스처 좌표 등 다양한 데이터가 포함됨.
  - 인덱스 버퍼: 삼각형을 구성하는 정점들을 가리키는 인덱스를 저장. 삼각형당 세개의 인덱스가 저장 됨.
  => 인덱스는 크기가 작아서 중복되도 메모리 낭비가 적다.
  * 인덱스 버퍼 없이 정점 버퍼에 인접한 정점을 중복 저장해 삼각형을 표현하는 인덱스 없는 삼각형 리스트는 매우 드뭄.

 

 - 삼각형당 캐쉬 미스 회수 (ACMR)

  삼각형 메쉬를 렌더링 할 때 GPU 렌더링 파이프라인 중

   정점처리 단계: 메쉬의 정점들 하나하나 변환되어 캐쉬에 저장 ->

   삼각형 단위의 연산 수행: 삼각형 구성하는 세 정점 인덱스를 통해 먼저 캐쉬에서 찾아보고,
   캐쉬에 정점이 없을 경우에만 그 정점을 정점 버퍼에서 꺼내 정점 처리 단계 통해 변환함.

  • 캐쉬에서 정점을 찾지 못했을 때에만 정점을 처리하므로,
    삼각형당 처리되는 정점의 평균 개수 = 삼각형당 캐쉬 미스 회수
  • 캐쉬 크기는 한정되어 있고, 캐쉬에서 정점을 발견 못할 경우 ACMR이 늘어나므로
    삼각형이 정렬된 순서가 ACMR에 영향을 미친다. => ACMR이 높을수록 속도 저하
  • 삼각형 처리 순서를 인접한 삼각형 순으로 할 수 있도록 재정렬 하는 알고리즘이 있다
    예) D3DX 인터페이스 ID3DXMesh::Optimize

 2. 삼각형 스트립 

 첫번째 삼각형: 정점 버퍼에서 첫 세 정점을 꺼내와 렌더링

 두번째 삼각형: 캐쉬에서 첫번째 삼각형의 마지막 두 정점을 읽어오고, 나머지 한개의 정점을 정점 버퍼에서 꺼내어 처리

 세번째 삼각형도 마찬가지.

 ACMR이 인덱스 삼각형 리스트보다 높아 렌더링 성능이 낮지만, 

 네 개의 정점으로 이루어진 사각형을 렌더링 할 때와 같이 특정 상황에서는 인덱스 버퍼 없는 삼각형 스트립 사용.

 


 

- 노멀 벡터 : 표면에 수직인 벡터

 조명 알고리즘에서 핵심적 역할.

  • 삼각형 노멀 계산 : 컴퓨터 그래픽스에서는 모든 노멀을 단위벡터로 표현하는 것이 원칙

 삼각형 <p1,p2,p3>

 오른손 법칙 기준(OpenGL),  :

p1,p2 잇는 벡터 v1 / p1,p3 잇는 벡터 v2 의 외적 결과 => v1 x v2를

 v1 x v2의 크기로 나누는 정규화  => 크기가 1인 단위 벡터 됨.

 

 * 벡터 오른손 법칙 설명 : https://zbaekhk.blogspot.com/2021/02/3d-right-hand-rule.html

 

[3D] 벡터 오른손 법칙(Right-Hand Rule)

 

zbaekhk.blogspot.com

  • 노멀은 물체 바깥을 향하게 해야 한다.

오른손 법칙에 따르면,

반시계 방향으로 정렬된 정점은 물체 표면에서 바깥쪽을 향하는 노멀을 생성 (시계 방향으로 정렬된 정점은 물체 안쪽을 향하는 노멀 생성)

=> 오른손 법칙 기준, 삼각형의 정점은 항상 반시계 방향으로 정렬된다.

=> 인덱스 삼각형 리스트 표현법에서 인덱스 버퍼는 정점을 반시계 방향으로 정렬하여 저장함.

* 다이렉트3D나 유니티는 왼손 법칙을 따른다고 한다.

 

 

  • 정점 노멀 : 해당 정점이 샘플링한 부드러운 표면의 노멀
    계산하는 간단한 방법 한가지는 모든 삼각형 노멀들의 평균을 그 정점의 노멀로 정하는 것.
    정점 버퍼에 저장되어 렌더링 단계로 넘겨짐.

 


- 오른손 좌표계와 왼손 좌표계 간 포팅

 1. 정점 재정렬 : 삼각형 노멀이 물체 바깥을 향하도록

  반시계 방향 정렬 : 오른손 좌표계(OpenGL)

  시계 방향 정렬 : 왼손 좌표계(다이렉트3D, 유니티)

 2. z좌표 부호 변경 (= xy평면에 대한 반사)

  z축이 반대방향 이므로 z좌표의 부호를 변경해야 서로 포팅시 동일한 결과 얻을 수 있음

 

 

반응형