렌더링 파이프라인
그래픽 처리 장치(GPU)의 프로그래밍이 가능한 렌더링 파이프라인을 조작할 수 있는 프로그래밍 언어이다.
렌더링 파이프라인은 크게 Fixed Pipeline과 Programmable Pipeline이 존재하는에 이중에 Shader가 반영화된 파이프라인이 Programmable Pipeline이다.
렌더링 파이프라인의 최종 목표는 컴퓨터 데이터를 모니터의 픽셀까지 뽑아내기 위한 것이다. 해당 파이프라인 안에서 데이터를 조작 할 수 있다.
Shader는 크게 두 가지가 존재한다.
Vertex Shader : 버텍스 파이프 라인에서 동작하는 쉐이더
Pixel Shader : 픽셀 파이프 라인에서 동작하는 쉐이더
셰이더
렌더링 파이프라인을 조종할 수 있는 프로그래밍 언어이다. 버텍스 쉐이더의 주 프로그래밍 요소는 각 정점의 공간을 변환하는 것이고 픽셀 쉐이더는 화면에 출력할 최종 색상을 계산하는 것이다.
Rendering Pipeline, 렌더링 순서다. 일반적인 렌더링 파이프라인의 큰 틀은, 밑의 과정과 같이 이루어져 있다.
1. 오브젝트 데이터 받아오기
2. 정점 쉐이더 (Vertex Shader)
+ 요즘 핫한 테셀레이션이 여기 중간에서 실행. (여기서도 다양한 쉐이더가 있음.)
3. 래스터라이져 (Rasterizer)
4. 픽셀 쉐이더 (Pixel Shader), 프레그먼트 쉐이더 (Fragment Shader)
1. 오브젝트 데이터 받아오기
그래픽 카드는 Vertex로 이루어진 물체의 데이터 값을 받아온다.
Vertex는 인덱스 넘버, 포지션, 노멀, 컬러 등의 정보를 가지고 있다.
그래픽 카드에서는 정보들을 이용해 버텍스들을 잇고, 삼각형 면을 생성하게 된다.
2. 정점 쉐이더 (Vertex Shader)
주된 임무는 각 정점의 공간을 변환하는 것이다. 3D 물체를 구성하는 정점의 수만큼 실행된다.
1) 로컬 좌표계 상태다. 자신이 (0, 0, 0) 의 위치값(중심값)을 가진다.
2) 월드 좌표계를 곱한다 월드의 중심이 (0, 0, 0) 이고, 다른 물체는 여기서 얼마나 떨어져있는가를 표현한다.
3) 카메라 행렬을 곱한다. 카메라의 중심이 (0, 0, 0) 이고 다른 물체들이 여기서 얼마나 떨어져있는가를 표현한다.
4) 프로젝션 행렬을 곱한다. 원근감을 부여해준다. 먼 곳은 좁혀진 것처럼 버텍스 위치를 조정해준다.
3. 레스터라이져
3D 오브젝트가 2D모니터에 보이도록 픽셀이 된다. 레스터라이져는 GPU가 담당한다.
주된 임무는 3D오브젝트가 2D모니터 상에서 어디 픽셀에 찍힐 지를 계산한다. 픽셀 수 만큼 실행된다. (화면 해상도만큼.)
4. 픽셀 쉐이더 / 프레그먼트 쉐이더 (Pixel/Fragment Shader)
모니터까지 넘어온 3D 그래픽 데이터가 본격적으로 픽셀로 찍히게 된다.
현재 사용되는 Shader 소개
대표적인 Shader 언어
각 플랫폼 별로 지원하는 언어가 존재하듯 Shader도 하드웨어나 엔진에 따라 여러 종류가 존재한다. 하지만 거의 매우 흡사한 형태의 언어이다.
HLSL(High Level Shading Language) : DirectX API에서 동작하는 Shader 언어
GLSL(OpenGL Shading Language) : OpenGL API에서 동작하는 Shader 언어
CG(C for Graphics) : nVidia에서 제작한 Shader 언어
위 3개는 대표적인 Shader 언어이고 Unity나 Unreal과 같은 멀티플랫폼 대응이 가능한 게임 엔진에서는 위 3개의 언어 기반으로 자체 언어가 존재한다.
Unity의 Shader는 "ShaderLab"라는 자체언어를 기반으로 세 가지 방법으로 Shader를 만들 수 있다.
- Surface Shader
- Fragment Shader
- Fixed function Shader
위 중에서 현재 가장 일반적으로 사용되는 것은 Surface Shader이다.
Unity 2018.1 부터 Unity Shader Graph라는 비주얼 노드 에디터 방식의 체계가 등장 했다. SRP(Scriptable Render Pipeline)에서만 사용이 가능하다.
언리얼4는 기본 노드기반으로 쉐이더를 작성한다. 세부적으로 Custom Node를 이용하여 HLSL문법으로 쉐이더 작성이 가능하다. 그리고 글로벌 쉐이더라는 명칭으로 USH/USF 스크립트 방식 쉐이더가 존재한다.
https://mingyu0403.tistory.com/110
CatDarkGame's Game Dev Story :: Shader의 정의와 기본 문법 (tistory.com)
'그래픽스 > 공통' 카테고리의 다른 글
드로우 콜과 배칭 개념 간단 정리 (0) | 2023.05.22 |
---|---|
그래픽스 파이프라인 (게임 엔진 관점) (0) | 2022.10.31 |
그래픽스 API 정의와 비교 분석 (0) | 2022.09.04 |
멀티 스레드 렌더링 (Multi Thread Rendering) (0) | 2022.08.25 |
폴리곤 메쉬 (Polygon Mesh) (0) | 2022.08.06 |