블로그 이미지
대갈장군

calendar

1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Notice

2010. 2. 18. 05:21 OpenGL


OpenGL 렌더링 파이프 라인에 대해서...

1. Pixel Data / Vertex Data
3차원 공간의 임의의 점 X는 위치 정보 (x,y,z)를 가지고 색상 정보 (RGB)도 가질 것이다. 이것이 바로 Vertex Data와 Pixel Data다. 이 두 놈이 입력으로 들어간다.

2. Display Lists
Display Lists는 미리 그려 놓은 그림들의 목록이다. 자주 사용되는 물체 (그림)을 미리 그려놓고 필요할때 신속히 꺼내서 그려낼수 있는데 이것이 바로 Display List 다. 프로그래밍에서 가장 흔한 '저장시켜놨다가 빨리 불러오기' 기법인 셈이다. 

3. Evaluators
모든 도형들 (2차원 도형이건 3차원 도형이건) 은 점(vertex)으로 표현된다. 예를 들자면, 사각형이 점 4개로 표현되고 오각형은 6개 정육면체 (3차원 도형)도 점 8개로 표현된다. 곡선이나 평면들도 처음에는 몇 개의 점으로 표현되거나 함수로 표현되지만 Evaluator를 거치면서 이런 함수적인 표현을 '점의 표현'으로 바꿔준다. 뭐 결국 따지고 보면 두 개의 점 사이에 놓인 점들을 인터폴레이션을 이용해 생성해낸다는 의미 아닌가? 이때 적용하는 방법이 이른바 'Polynomial mapping' 인데 이것을 사용하면 표면의 Normal vector와 texture coordinates 그리고 색상등을 알수 있다.

4. Per-Vertex Operations
Vertex data 에 대한 다음 Step은 Per-Vertex Operation 인데 이놈은 Vertices를 Primitives로 바꿔주는 놈이다. 여기서 잘 보면 Vertices (여러개의 점들을) Primitives (직선 또는 삼각형 또는 사각형, 혹은 다각형) 으로 바꾼다는 의미다. 이때 일부 Vertex Data는  4 x 4 floating-point matrices를 이용해서 transformed 된다. 이 말이 어렵게 들릴지 모르나 사실은 쉬운 이야기다. 3차원 공간의 물체를 2차원 평면 (모니터 스크린)을 통해서 보려면 3차원 -> 2차원 변형이 필요한데 이때 사용되는 특별한 함수가 있다. 이 함수를 행렬로 표현하면 4 x 4 형태의 매트릭스가 된다. 고로 3차원 공간을 2차원 평면에 투영시키기 위한 일종의 함수 대입 과정일 뿐이다. 

이 단계에서 추가로 가능한 작업들이 몇가지 있는데 만약 텍스쳐가 사용되었다면 텍스쳐 좌표가 생성되고 투영되며 조명이 있다면 그것도 계산해야하고 물질 표면 속성이 설정되어 있다면 이것 역시 여기서 다 계산한다. 좀 많네...

5. Primitive Assembly
Clipping 은 Primitive Assembly의 주요 파트인데 이것은 안보이는 부분 잘라내기다. 이 과정이 끝나면 나오는 결과물은 완전한 Geometric Primitives 들인데 (3차원 도형들) 이 놈들은 2차원 평면에 표현되기 위해 적절하게 Transformed 된 상태이며 적절히 Clipped 된 상태이다. 게다가 각 포인트의 색상과 깊이 그리고 텍스쳐 좌표까지 가지고 있다. 고로 이놈들은 다음 단계인 Rasterization 과정에서 가이드 라인으로 사용된다.

6. Pixel Operation
자 Vertex Data 들이 3,4,5의 과정을 거치는 동안 Pixel Data 는 이른바 Pixel Operation 과정을 거치는데 시스템 메모리 상에 존재하는 Pixel들은 우선 Unpacking ( 풀어내는 과정)을 거치는데 이때 수많은 포맷들 중 하나의 형태로 풀어진다. 그런 다음 각종 처리 (Scaling, Biasing, Pixel mapping) 를 거치게 된다. 이 과정을 사용자가 모두 세부 설정을 할 수 있는 것들이다. 그런다음 그 결과물은 Texture Memory에 저장이 되거나 혹은 Rasterization Step 으로 보내지게 된다. 

7. Texture Assembly
이 과정은 말 그대로 텍스쳐 입히기이다. 뭐 별다른 설명은 지금으로서는 필요 없을 듯하다.

8. Rasterization
이 단어를 사전에서 찾아보면 '인쇄하기' 인데 대략 그 말이 맞다. OpenGL 적으로 표현하자면 지금까지 모은 도형 정보와 픽셀 정보를 Fragment로 인쇄한다. 이 Fragment는 하나의 픽셀 (화면상에 보여질 픽셀)에 대응되는 놈으로 각 Fragment는 색상과 깊이 값을 가진다. 

9. Fragment Operations
화면에 보여지기 위한 최종 단계로서 스크린과 같은 화면을 저장하는 Frame buffer에 저장하기에 앞서 여러 가지 계산 과정을 거쳐야 한다. 예를 들자면 Alpha 테스트 (투명도 테스트), Stencil 테스트 (스텐실 테스트), 깊이 테스트등등. 이런 일련의 테스트들을 사용자가 모두 정의하고 어떤 방식으로 계산할 것인지를 지정할 수 있다. 즉, 사용자 맘대로 출력 할 수 있다는 것이다.





posted by 대갈장군