물이 일렁이고, 캐릭터가 피격 시 하얗게 번쩍이고, 화면이 만화처럼 보이게 하는 효과는 대부분 셰이더로 만듭니다. 셰이더는 GPU에서 실행되어 화면의 점과 색을 계산하는 작은 프로그램입니다. 이 글은 셰이더 프로그래밍을 처음 접하는 프로그래머를 위해 기본 구조와 공부 순서를 정리합니다.
셰이더는 왜 따로 배워야 하나
일반 게임 코드는 CPU에서 한 줄씩 실행됩니다. 셰이더는 GPU에서 수천, 수만 개의 점과 픽셀에 대해 같은 코드를 동시에 실행합니다. 그래서 생각하는 방식이 다릅니다. '이 픽셀 하나의 색을 어떻게 정할까'만 생각하고, 그 코드가 모든 픽셀에 한꺼번에 적용된다고 보면 됩니다.
이 구조 때문에 셰이더에서는 다른 픽셀의 결과를 마음대로 볼 수 없고, 조건문이 많으면 성능이 떨어질 수 있습니다. 대신 같은 계산을 대량으로 할 때는 CPU보다 훨씬 빠릅니다.
렌더링 파이프라인 한눈에 보기
- CPU가 그릴 메시와 재질, 변환 행렬을 GPU에 넘깁니다.
- 버텍스 셰이더가 정점(꼭짓점)마다 화면상의 위치를 계산합니다.
- 래스터화 단계에서 삼각형이 화면의 픽셀 조각으로 나뉩니다.
- 프래그먼트(픽셀) 셰이더가 픽셀마다 최종 색을 계산합니다.
- 깊이 검사와 혼합(블렌딩)을 거쳐 화면에 기록됩니다.
이 중 프로그래머가 직접 코드를 쓰는 곳은 주로 버텍스 셰이더와 프래그먼트 셰이더입니다. 벡터와 행렬 계산이 여기서 바로 쓰이므로 게임 수학 기초를 먼저 익혀 두면 이해가 훨씬 쉽습니다.
버텍스 셰이더와 프래그먼트 셰이더
| 구분 | 하는 일 | 만들 수 있는 효과 |
|---|---|---|
| 버텍스 셰이더 | 정점 위치와 법선, UV 좌표 처리 | 깃발 펄럭임, 풀 흔들림, 물결 파도 |
| 프래그먼트 셰이더 | 픽셀 색 계산, 텍스처 읽기, 조명 계산 | 피격 번쩍임, 디졸브(타 들어가며 사라짐), 툰 셰이딩, 외곽선 빛 |
두 셰이더는 데이터를 이어 받습니다. 버텍스 셰이더가 계산한 값은 삼각형 안에서 자동으로 보간되어 프래그먼트 셰이더로 전달됩니다. 이 원리를 알면 왜 정점 수가 적은 모델에서 효과가 거칠게 보이는지도 이해할 수 있습니다.
조명 계산의 기초
셰이더에서 빛을 계산할 때 가장 먼저 배우는 것은 램버트 확산 조명입니다. 표면의 법선 벡터와 빛 방향 벡터의 내적으로 밝기를 정합니다. 빛을 정면으로 받으면 밝고, 비스듬하면 어두워집니다. 여기에 반짝이는 하이라이트(스페큘러)를 더하면 기본 조명 모델이 완성됩니다.
툰 셰이딩은 이 밝기 값을 몇 단계로 끊어 만화 같은 명암을 만드는 방식입니다. 현대 엔진의 PBR(물리 기반 렌더링)은 훨씬 정교하지만, 내적으로 밝기를 구한다는 출발점은 같습니다.
셰이더 언어와 노드 편집기
- HLSL: DirectX 계열에서 쓰는 셰이더 언어, 유니티와 언리얼에서도 널리 쓰임
- GLSL: OpenGL 계열 셰이더 언어
- 셰이더 그래프(유니티), 머티리얼 에디터(언리얼): 코드 대신 노드를 연결해 셰이더를 만드는 도구
노드 편집기는 결과를 바로 눈으로 보며 만들 수 있어 입문에 좋습니다. 테크니컬 아티스트도 주로 이 도구를 씁니다. 다만 노드 하나하나가 실제로 어떤 계산인지 알고 써야 응용과 최적화가 가능하므로, 간단한 효과는 코드로도 한 번 작성해 보길 권합니다.
입문 과제와 다음 단계
- 시간 값을 이용해 색이 천천히 바뀌는 셰이더
- UV 좌표를 흘려 물이 흐르는 듯한 텍스처 스크롤
- 피격 시 흰색으로 번쩍이는 효과
- 노이즈 텍스처로 디졸브 효과
- 밝기를 단계로 끊는 툰 셰이딩
셰이더는 계산이 픽셀 수만큼 반복되므로 작은 비용도 크게 불어납니다. 화면 전체를 덮는 효과일수록 텍스처 읽기 횟수와 계산량을 신경 써야 합니다.
기본 효과를 만들 수 있게 되면 후처리 효과(블룸, 색 보정)와 깊이 버퍼를 이용한 효과로 넓혀 보세요. DirectX나 OpenGL로 삼각형 하나를 직접 그려 보는 경험도 파이프라인 이해에 큰 도움이 됩니다.
SBS아카데미게임학원 게임프로그래밍 과정은 Unity 엔진에서 이펙트 적용 단계를 실습하며 포트폴리오를 만드는 수업을 포함하고 있어, 셰이더 기초를 실제 효과 제작과 연결해 볼 수 있습니다.
자주 묻는 질문
셰이더는 프로그래머와 아티스트 중 누가 만드나요?
회사마다 다르지만 엔진 수준의 셰이더는 그래픽스 프로그래머가, 효과용 셰이더는 테크니컬 아티스트가 노드 편집기로 만드는 경우가 많습니다.
셰이더 공부에 수학이 많이 필요한가요?
벡터 내적, 정규화, 보간, 행렬 변환 정도를 알면 입문 단계의 효과는 대부분 만들 수 있습니다.
