ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1066) N
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (179) N
      • Unreal (69)
      • Unity (99) N
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 티스토리챌린지
  • c#
  • 클래스
  • C++
  • 백준
  • 문자열
  • Unity
  • 언리얼
  • 포인터
  • 프로그래머스
  • 배열
  • 오블완
  • 알고리즘
  • 파이썬
  • C
  • 유니티
  • 함수
  • string
  • SQL
  • 그래픽스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

셰이더란? (Shader)
그래픽스/공통

셰이더란? (Shader)

2022. 10. 30. 14:18

렌더링 파이프라인

그래픽 처리 장치(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

Unity의 Shader는 "ShaderLab"라는 자체언어를 기반으로 세 가지 방법으로 Shader를 만들 수 있다.

- Surface Shader

- Fragment Shader

- Fixed function Shader

 

위 중에서 현재 가장 일반적으로 사용되는 것은 Surface Shader이다.

Unity Shader Graph

Unity 2018.1 부터 Unity Shader Graph라는 비주얼 노드 에디터 방식의 체계가 등장 했다. SRP(Scriptable Render Pipeline)에서만 사용이 가능하다. 

Unreal4 Shader

언리얼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
    '그래픽스/공통' 카테고리의 다른 글
    • 드로우 콜과 배칭 개념 간단 정리
    • 그래픽스 파이프라인 (게임 엔진 관점)
    • 그래픽스 API 정의와 비교 분석
    • 멀티 스레드 렌더링 (Multi Thread Rendering)
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바