일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
31 |
- Fetching
- rasterization
- Mipmap
- 개발자면접
- DrawCall
- 힙
- 포워드 렌더링
- 그래픽스 파이프라인
- UnReal
- std::vector
- 스택
- 이중우선순위큐
- 데이터분석
- 어레이
- Page Fault
- 외적
- bvh
- vertex shader
- 코테
- Stack
- 취준
- graphics rendering pipeline
- 디퍼드 렌더링
- Input Assembler
- Output Merge
- c++
- occlusion culling
- Tesselation
- im뱅크
- multiset
- Today
- Total
평생 배우는 개발자
Graphics Rendering PipeLine 본문
개발 면접 간에 그래픽 렌더링 파이프라인에 대해서 설명해야 하는 경우를 준비해 보자
이때 순서를 주욱 나열하면서 말하는 것보다, 비전공자들이 들어도 알아들을 수 있게 자세하고 쉽게 설명해 주세요라는 요청이 있다고 가정하고 준비를 해보자.
그래픽렌더링 파이프라인은 우리가 실제세계에 존재하는 3D물체를 우리가 보는 2D컴퓨터 스크린에 그리기 위한 일련의 과정들이라고 볼 수 있다.
예를 들어 100m짜리 건물을 30cm 정도 하는 컴퓨터 스크린에 그리기 위해서는 좌표들을 컴퓨터 스크린에 맞게 다시 계산하고 그려야 한다. 이 건물의 꼭짓점에 대한 정보를 vertex라고 한다.
vertex의 정보들로는 position, normal, uv, color값등이 있다. 모든 vertex값들을 VBO(vertex buffer object)라는 저장공간에 저장한다. 다음, 이 EBO(element buffer object) vetices들이 그려지는 순서인 index를 저장한다. 위 저장공간들을 VAO라는 배열에 일렬로 저장한다. 이후 하나의 vertex별로 크기를 알 수 있게 하는 Layout정보와 함께 CPU에서 GPU로 정보들을 넘긴다. CPU는 한 번에 하나의 일을 할 수 있는 반면, GPU는 병렬적으로 수식을 처리할 수 있기 때문에 수많은 vertices에 대한 계산을 효율적으로 하기 위해서 GPU로 넘기는 것이다.
이후 GPU로 넘어온 vertices의 정보들을 Layout에 따라 구분하고 구조화한다. 이후 각 vertex정보가 vertex shader로 옮겨간다. vertex shader(이하 VS)에서는 좌표에 대한 계산을 주로 한다. 우리가 VS에 받아온 것은 model에 대한 vertex 정보이다. 즉 100m짜리 건물의 높이인 100m를 그대로 받아온 것이다.
이를 일정 비율로 계산하여 컴퓨터 세상에 알맞은 정보로 바꾸는 과정이 Model transform이다. 이 과정은 transform, rotation, scale로 이루어져 있으며, 이 계산을 거치면 model space에서 world space로 좌표들이 바뀐다. 결괏값으로는 mat4형식의 값을 얻을 수 있다.
이후 world space로 좌표를 바꾸었다 해도 결국 우리는 Camera를 통해서 화면을 본다. 즉, camera가 비추는 곳 만 보는 것이다. 따라서 world space를 view space로 바꿔야 하고 이 과정을 view transform이다. 이는 우리의 world space좌표에 카메라 시점에 대한 계산을 해서 view space로 옮기는 과정을 이행한다. 계산으로는 lookat함수를 쓸 수 있으며 카메라의 위치, 카메라가 보는 대상의 위치, up벡터가 필요하다.
이후 결국 우리가 보는 screen은 2D이므로 view space에 있는 3D 공간의 좌표를 한 평면에 대해서 표현해야 한다. 이 과정을 projection transform이라 칭한다. 이 방법은 크게 두 가지로 이루어져 있는데 하나는 orthograpic projection이고 하나는 perspective projection이다. 전자는 원근법을 사용하지 않고 그대로 나타내는 방법이고 후자는 원근법을 사용하여 카메라에 가까이 있는 물체는 크게 멀리 있는 물체는 작게 나타내는 방식이다. 이 과정에서 glm::perspective함수 등을 쓸 수 있으며 카메라의 fov(field of view(시야각)), near, far, aspect(비율)에 대한 정보를 알고 있으면 사용가능하다.
이 계산으로 Homogeneous Coordinate 위의 최종 vec4의 값 x, y, z, w을 얻을 수 있다. 이후 vertex shader에서 gl_Position에 값에 clip space에 대한 vec4 값을 반환하면 OpenGL이 자동으로 x, y, z에 w값을 나누어서 NDC좌표로 변환한다. 그러면 모든 좌표가 변의 크기가 2인 큐브 안에 위치한다고 생각할 수 있겠다.
이후 필수 과정은 아니지만 tessellation shader로 넘어가서 계산이 된다. 이 shader에서는 하나의 폴리곤에 vertex를 더하여 폴리곤의 수를 늘리거나 줄이는 계산을 할 수 있는 shader이다. 곡면을 여러 개의 폴리곤으로 나누어 더 자연스럽게 휘는 곡면을 표현하거나, LOD처럼 멀리 있는 물체의 폴리곤의 수는 적게, 가까이 있는 물체의 폴리곤의 개수는 많게 하여 그래픽 품질에 영향을 많이 주지 않으면서 최적화를 할 수 있는 기법을 계산할 수 있다. gl_TessLevelInner [0], gl_TessLevelOuter [0] 등의 값을 조절하여 계산할 수 있다.
이후 geometry shader로 가서 계산을 한다. 이 shader에서는 추가적인 vertex를 만들고 그것들을 이어서 line이나 triangle 등의 primitive로 도형을 추가할 수 있다. 수많은 잔디를 생성할 때 등에 사용 가능 하다.
아래는 rasterization의 과정이다.
- Viewport Transform (NDC → Screen Space)
- Primitive Clipping (잘릴 삼각형 제거)
- Triangle Setup (삼각형 속성 설정)
- Scan Conversion (Rasterization 수행)
- Fragment Interpolation (보간 값 계산)
- Fragment Shader 실행
- Depth Test, Blending, Stencil Test 수행
- Framebuffer에 최종 픽셀 저장
rasterization과정은 우리가 얻었던 NDC공간에서의 좌표를 사용해 screen space에 그려질 픽셀을 구하는 과정이다. NDC에서 x, y값으로 계산이 되고 z값은 depth값으로 쓰인다. 이 과정에서 clipping, interpolation 등이 이루어진다. clipping은 NDC 밖의 삼각형은 잘라내는 과정이고 interpolation은 최종 삼각형 내에서 최종적으로 우리가 가져가서 색을 채워 넣을 픽셀을 구하는 과정이다.
이후 얻어진 pixel을 fragment shader로 넘긴다. 여기서 각 픽셀에 color나 그림자, texture 등의 정보를 넣는다. 이후 depth test(z값을 이용하여 최종 그릴 pixel판단), Blending(투명한 오브젝트를 자연스럽게 합성하는 단계), Stencil Test(원하는 공간의 픽셀만 나오게 계산하는 단계)등이 수행된다.
이후 frame buffer로 저장되고(gl_FragColor로 반환됨) GPU가 렌더링을 하고 최종 값을 screen에 그린다.
출처 : Real-Time Rendering, Fourth Edition | Tomas Akenine-Moller,chatGPT
위 과정은 OpenGL 기준으로 작성되었습니다.
'개발면접준비' 카테고리의 다른 글
2025 메이플 집중채용 - 메이플스토리 pc 게임 프로그래머 채용 후기(1) (3) | 2025.05.24 |
---|---|
2025 메이플 집중채용 - 메이플스토리 pc 게임 프로그래머 채용 후기(0) (2) | 2025.05.23 |
mipmap (3) | 2025.01.21 |
Texture Fetch (5) | 2025.01.20 |
Graphics Rendering Pipeline (8) | 2025.01.18 |