OpenGL graphics pipeline

Shader란 rendering pipeline (graphics pipeline)의 중간에 위치하여 어떠한 필요한 계산을 해주는 비교적 작은 크기의 programmable unit을 말한다.

OpenGL에서 사용 가능한 shader의 종류는 다음 세 가지가 있다.
1. vertex shader (VS)
2. geometry shader (GS)
3. fragment shader (FS)

우선 OpenGL에서 사용하는 vertex의 개념부터 알아보자.

Vertex한 점에 정의된 attribute들의 집합을 말한다.
예) location in space, color, normal, texture coordinates 등.

VS: per vertex operation
VS는 vertex 좌표값 조작, normal 값 조작 (또는 생성), texture 좌표값 조작 (또는 생성) 등의 기능을 수행할 수 있다. (Vertex 좌표값을 조작하므로 animation 효과를 주는 것도 가능하다.) Fixed functionality의 이 단계에서 수행되는 대표적인 기능은 3D world position을 2D device position으로 transform하는 것이다. VS에서 이러한 계산의 결과로 나온 data들은 추후에 FS로 흘러들어가게 된다.

VS에서 계산되어 내보내어진 transformed vertex들은 바로 FS로 흘러들어가기 전에 한 가지 단계를 거치게 되는데, 이 단계를 primitive assembly stage라고 한다. Primitive assembly stage는 VS로 부터 transformed된 vertex들에 대한 정보를 받고, application으로 부터 vertex들을 연결하는 connectivity 정보를 받늗다. Connectivity 정보란 vertex들이 어떻게 연결되어 각각의 primitive들을 어떻게 구성하는 지에 대한 정보를 말한다. 이 단계에서 각 primitive별로 작동하는 shader를 geometry shader (GS)라고 한다. 만약 application이 adjacent primitive들을 구성하는 vertex 정보까지 제공한다면 GS에서 adjacency 정보 또한 활용이 가능하다. 이러한 adjacency 정보는 GS에서만 사용이 가능하며, 만약 GS가 생략되어있는 상태라면 무시된다. Primitive assembly stage의 output은 primitive들이다. 만약 glBegin(GL_TRIANGLES)로 connectivity가 정의된 6개의 vertex가 VS 단계로 흘어들어왔다면, primitive assembly stage의 output은 2개의 triangle이 된다. 마찬가지로 만약 glBegin(GL_TRIANGLE_STRIP)으로 connectivity가 정의된 6개의 vertex가 graphics pipeline에 입력되었다면, primitive assembly state의 output은 4개의 triangle이 된다. (OpenGL 4.0 부터는 tessellation control shader라는 개념이 도입되었는데, 이것을 사용하는 경우에 assembly primitive는 primitive들 대신 patch들을 내보내게 된다.)

tirangles

이 과정에서는 transformed vertex들과 추가적으로 입력된 connection 정보를 이용하여 primitive들을 만들고 (primitive assembly), 다시 rasterization 과정을 거쳐 fragment들을 만들어낸다.
Primitive란 geometry를 구성하는 기본 단위로서 triangle, line, point 등을 말한다.
이 단계에서 view frustum clipping, back face culling과 같은 test들도 수행된다.
이 단계에서 만들어진 output은 framebuffer상의 fragment의 위치와 각 fragment당 interpolated attribute들이다. 즉, Per vertex data인 color, normal, texture coordinates, depth value 등이 interpolation 과정을 거쳐 per fragment data로 변환되는 과정이라고 생각하면 된다.
이렇게 만들어진 fragment들은 FS로 입력되어 추가적인 계산이 이루어진다.

FS: per fragment operation
이전 단계에서 계산된 data들(pixel location, fragment별 color, depth값 등)을 입력받아 추가적인 계산을 수행한다.
이 단계에서 texture image로 부터 color값을 읽어서 fragment의 color값을 변경하는 계산도 이루어진다.
GPU 기반의 ray tracing algorithm또한 FS level에서 구현이 가능하다.

visualpipeline OpenGL2GraphicsPipelinepipeline

graphics pipeline

 

OpenGL4

답글 남기기