프로그래밍/OpenGL2009.04.23 16:20

1. OpenGL의 좌표계

- 오른손 좌표계를 사용함

1.1 Viewport

- 논리적 좌표를 물리적인 화면 픽셀 좌표로 전환하는 과정



1.2 Local coordinate system

- 3D에서 object는 정점(vertex) 리스트로 구성된다. 그 정점들을 기준좌표(0, 0, 0)으로 부터의 거리. 즉, 상대적 좌표리스트로 구성됨.

1.3 World coordinate system

- Local coordinate system으로 구성된 오브젝트를 실제의 위치상에 배치하기 위해서는 월드상의 좌표계로 이동하여 계산하도록 한다.


1.4 Camera coordinate system

- 카메라가 보고 있는 위치에 따라 오브젝트가 다르게 보이므로 최종적으로 카메라좌표를 기준으로 각 오브젝트들의 위치계산을 해야 한다.

- 관측지점과 관측 방향을 알아야 함.

 

2. 투영

- 3D 좌표계 내에서 만들어진 지오메트리들을 편평한 2D 공간으로 옮기는 과정.


2.1 직교 투영(orthographic projection)

- 정사각형 또는 직사각형의 영역 내에 모든 것이 투영.

- 그 영역을 벗어나는 것들은 그려지지 않는다.

- 영역 내에 있는 모든 물체들이 거리에 관계없이 모두 같은 크기 비율로 표현


2.2 원근 투영(perspective projection)

- 물체의 거리에 따라서 2D 화면에 나타나는 크기가 달라짐


3. OpenGL Rendering Pipeline

 

3.1 Display list

- 기하학적인 정보를 나타내는 데이터든, 픽셀을 나타내는 데이터든 상관없이 모든 데이터들을 display list에 저장해둘 수 있다.

3.1.1 Display list를 사용하는 이유

- OpenGL 커맨드들을 나중에 다시 사용하기 위해서 저장하는 데 사용되기 때문에 성능을 향상시켜 줄 수 있다.

3.2 평가자

- 모든 기하 프리미티브들은 결국 정점으로 표현된다. 매개변수 곡선이나 곡면은 기저 함수라고 불리는 다항 함수와 제어점들로 표현된다. 평가자를 사용하면, 제어점으로부터 곡면을 표현하는 데 사용되는 정점들을 구할 수 있다. 이때 다항식 매핑(polynomial mapping)이라는 기법을 사용하면, 제어점으로부터 표면 법선(surface normal), 텍스처 좌표, 컬러, 공간 좌표 등을 얻을 수 있다.

- 제어점만으로 커브나 표면상의 임의의 점을 지정 하여, 커브나 표면 렌더링 가능.

3.3 정점 연산(Per-Vertex Operation)

- 공간 좌표와 같은 일부 정점 데이터들을 4X4 부동 소수점 행렬로 변환.

- 3D 공간의 한 지점을 나타내던 공간 좌표를 스크린상의 한 지점으로 투영 시킨다.

 

3.4 Primitive Assembly

- 주된 부분은 clipping 수행.

3.5 Rasterization

- 기본도형에 속한 영역을 한 줄씩 픽셀들로 채우는 과정

- 기하 데이터와 픽셀 모이터를 모두 fragment로 변환한다.

- 각각의 fragment들은 사각형으로 되어 있으며, 프레임버퍼의 한 픽셀에 대응된다.


3.6 Fragment 연산

- 특정한 fragment 연산을 tngiod하여 특정한 fragment들을 변경하거나 제거한다

- 가장 먼저 수행하는 연산은 텍스처 메모리로부터 각각의 fragment에 대한 텍셀(texture element)를 생성하여 해당 fragment에 적용하는 텍스처링이다. 텍스처링 이후 fog연산과 scissor 테스트, 알파 테스트, 스텐실 테스트, 깊이 버퍼 테스트 등을 차례로 수행

※ scissor 테스트 : 응용 프로그램은 뷰포트 안에 가위 사각형 이라고 하는 사각형 영역을 지정할 수 있다. 그 사각형은 렌더링이 일어나는 영역을 결정한다

저작자 표시 비영리
신고

'프로그래밍 > OpenGL' 카테고리의 다른 글

옥트리(octree)  (0) 2009.04.25
OpenGL Viewing  (0) 2009.04.24
OpenGL 기초  (1) 2009.04.23
Picking 사용하기  (0) 2009.04.22
void glutIdleFunc(void (*func)(void))  (0) 2009.04.22
void glutPostRedisplay(void)  (0) 2009.04.22
Posted by 마블(이환문)

티스토리 툴바