[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나 유니티는 왼손 법칙을 따른다고 한다.
- 정점 노멀 : 해당 정점이 샘플링한 부드러운 표면의 노멀
계산하는 간단한 방법 한가지는 모든 삼각형 노멀들의 평균을 그 정점의 노멀로 정하는 것.
정점 버퍼에 저장되어 렌더링 단계로 넘겨짐.
- 오른손 좌표계와 왼손 좌표계 간 포팅
1. 정점 재정렬 : 삼각형 노멀이 물체 바깥을 향하도록
반시계 방향 정렬 : 오른손 좌표계(OpenGL)
시계 방향 정렬 : 왼손 좌표계(다이렉트3D, 유니티)
2. z좌표 부호 변경 (= xy평면에 대한 반사)
z축이 반대방향 이므로 z좌표의 부호를 변경해야 서로 포팅시 동일한 결과 얻을 수 있음
'코딩테스트 및 개인공부 > 3D 그래픽스(게임수학)' 카테고리의 다른 글
[2] 렌더링 파이프라인 - 1.정점 처리 단계 (0) | 2022.06.10 |
---|