Develog
1. Shader 본문
CPU와 GPU
CPU는 복잡한 연산의 순차 처리에 특화되어 있는 유닛(Unit)이지만, GPU는 단순한 연산의 병렬 처리에 특화되어 있는 유닛이다. 이러한 구조적인 차이 때문에 CPU에서 픽셀 단위의 연산을 처리한다면, 픽셀의 수만큼 엄청난 양의 연산을 순차적으로 반복해야 한다. (1920 * 1080 = 2,073,600번)
(참고: https://youtu.be/ZrJeYFxpUyQ?si=rDr9yryrzvMwzwa8)
드로우 콜 (Draw Call)
복잡한 처리를 CPU가 먼저 처리한 다음, GPU에 '완벽하게 준비된 데이터'만 전달하여 빠른 속도로 계산만 진행한다. 이때, CPU가 GPU에게 '그리기' 명령을 내리는 것을 드로우 콜(Draw Call)이라고 부른다.
드로우 콜을 받은 GPU는 CPU에서 전달받은 명령을 분석하여 아래 순서에 맞게 명령을 처리한다. 이때, 명령을 처리하는 순서를 묶어서 셰이더 스테이지(Shader Stage)라고 부른다.
- Vertex Shader: 각각의 정점의 좌표를 계산한다. CPU에서 받은 폴리곤 데이터를 바탕으로 어떤 픽셀이 그려질 것인지 계산하기 위해 카메라의 위치, 오브젝트의 위치 등을 계산한다.
- HUll/Domain/Geometry
- Rasterizier: Vertex Shader의 연산 결과를 바탕으로 어떤 픽셀이 어떻게 그려질 것인지 계산한다.
- Pixel Shader: Rasterizer의 연산 결과를 바탕으로 각 픽셀 단위로 '그리기' 명령을 처리한다.
GPU의 메모리 구조
GPU의 메모리는 레지스터(Register)와 비디오 메모리(Video Memory)로 구분된다.
레지스터는 쓰레드(Thread) 로컬 개념이며, 속도가 매우 빠르다. 쓰레드 종속적이기 때문에 다른 쓰레드는 참조가 불가능하며 개별적인 용량은 작은 편이다. (변수 몇 개 정도 저장할 수 있는 사이즈)
- 예) 책상에 붙어있는 작은 서랍장
비디오 메모리는 종류에 따라 공유되는 범위가 다르지만, 공용으로 사용되는 개념이기 때문에 필요에 따라 자유롭게 다른 데이터에 참조하는 것이 가능하다. 레지스터보다 용량은 크지만 속도는 느린 편이다. (텍스처, 버퍼, 등을 저장할 수 있는 사이즈)
- 예) 작업실 뒷편에 있는 책장
내가 작성한 셰이더 코드가 특정 상황에서 메모리 참조 문제 때문에 느려진다는 것이 발견된다면 비디오 메모리 대신 레지스터에 참조하는 방식으로 성능 최적화가 가능하다.
- 예) 간접광 처리: 간접광은 픽셀 단위로 처리할 수도 있으나, Vertex Shader 단계에서 미리 계산했다가 Pixel Shader 단계를 처리할 때 연산 결과만 전달해주면 성능 문제를 해결할 수 있다. (결과값의 정밀도는 떨어질 수 있음)
'Technology > Shading & Rendering' 카테고리의 다른 글
| 2. Graphics API (0) | 2026.01.25 |
|---|
