vertex = 버텍스 = 정점

fragment = 프래그먼트 ≒ 픽셀

OpenGL에서는 모든 것이 3D공간에 있지만 화면과 창은 2D 픽셀 배열이므로, OpenGL작업의 많은 부분이 3D좌표를 화면에 맞는 2D 픽셀로 변환하는 것이라고 볼 수 있다. 3D좌표를 2D 좌표로 변환하는 프로세스는 OpenGL의 그래픽 파이프라인에 의해 관리된다. 그래픽 파이프라인은 크게 두 부분으로 나눌 수 있다. 첫 번째 부분은 3D 좌표를 2D좌표로 변환하고, 두 번째 부분은 2D 좌표를 실제 색이 있는 픽셀로 변환하는 것이다. 이 튜토리얼에서는 그래픽 파이프라인에 대해 간략히 논의하고 멋진 픽셀을 만드는데 어떻게 활용하는지에 대해 간략히 설명할 것이다.

<aside> 💡 2D 좌표와 픽셀에는 차이가 있다. 2D 좌표는 점이 2D 공간에 위치를 나타내는 매우 정확한 표현이고, 2D 픽셀은 screen/window 해상도로 제한된 지점의 근사치이다.

</aside>

그래픽 파이프라인은 입력으로 3D 좌표 집합을 가져와 화면의 컬러 2D픽셀로 변환한다. 그래픽 파이프라인은 여러 단계로 나눌 수 있다. 각 단계에서는 입력으로 이전 단계의 결과가 필요하다. 이 모든 단계는 고도로 전문화되어 있으며 병렬로 쉽게 실행할 수 있다. 병렬성으로 인해 현재 대부분의 그래픽 카드에는 파이프라인의 각 단계마다 GPU에서 작은 프로그램을 실행해 그래픽 파이프라인 내에서 신속하게 데이터를 처리할 수 있는 수천 개의 작은 프로세싱 코어가 있다. 이러한 작은 프로그램을 쉐이더라고 한다.

이러한 쉐이더 중 일부는 개발자가 구성할 수 있으므로 기존의 쉐이더를 대체할 쉐이더를 만들 수 있다. 이렇게 하면 파이프라인의 특정 부분에 대한 세분화된 제어가 가능하며 GPU에서 실행되기 때문에 CPU시간을 절약할 수 있다. 쉐이더는 GLSL(openGL Shading Language)로 작성되었으며, 다음 튜토리얼에서 더 자세히 설명할 것이다.

아래에서 그래픽 파이프라인의 모든 단계에 대한 추상 표현을 찾을 수 있다. 파란색 섹션은 우리가 우리 자신의 쉐이더를 삽입할 수 있는 섹션을 나타낸다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a7c48aaf-49a4-4106-9059-7ad707894573/pipeline.png

보다싶이 그래픽파이프라인에는 버텍스 데이터를 완전히 렌더링된 픽셀로 변환하는 특정 부분을 처리하는 여러 섹션이 있다. 우리는 간략하게 파이프 라인의 각 부분을 설명해 파이프라인이 어떻게 작동하는지를 간략하게 설명할 것이다. 그래픽 파이프라인의 입력으로 우리는 3개의 3D좌표 목록을 전달한다. 이 좌표는 버텍스 데이터라는 삼각형을 형성하기 위한 3개의 3D 좌표의 목록이다. 이 버텍스의 속성 데이터는 우리가 원하는 모든 종류의 데이터를 포함할 수 있지만, 단순화를 위해 지금은 각 정점의 3D위치와 색상 값으로 구성된다고 가정하자.

<aside> 💡 OpenGL이 좌표 및 색상 값 집합을 어떻게 구성하는지 알기 위해서, OpenGL은 사용자가 데이터로 형성하고자 하는 Render 타입을 알려주어야 한다. 데이터를 여러 점, 삼각형, 선으로 그리기 위해 설정하는 힌트를 primitives라고 한다. 이러한 힌트들은 모든 그리기 명령을 호출할 때 마다 OpenGL에게 주어지게 된다. 이러한 힌트로는 GL_POINTS, GL_TRIANGLES, GL_LINE_STRIP가 있다.

</aside>