Engineering/Computer Graphics

Rendering, Shader, GPU에 어떻게 올라가는가?

luckydipper 2026. 2. 21. 11:50
반응형

1. 랜더링이란?

3차원 가상의 세계에서 가상의 카메라를 기반해서 2D 영상을 뽑아내는 알고리즘이다. 이때, 3차원 공간상의 물체(Edge, Vertex, Point cloud)등을 Primitive라고 한다. 이미지를 만들 때 사용된 3D공간(Frustum), 빛(주변광), 물체의 표면, 카메라 위치 등을 Scene이라고 정의한다.

2. 쉐이더란?

위키피디아는 "랜더링의 과정에 쓰이는 하나의 알고리즘"으로 정의한다.

쉐이더는 Stage로 나뉘어 랜더링 파이프라인 안에 들어간다.

Real Time Rendering 책은 Shading은 두 가지 용어로 정의한다.

  • Visual Apearance (시각적 외형)
    Shading Model: 빛이 물체의 표면에서 반사되는 물리 모델
    Shading Equation: 색, 밝기를 계산하는 수식
    Toon Shading: 만화와 같은 느낌을 위해 외곽선 강조, 색을 단순화하는 쉐이딩
  • Programmable Component (위와 동일하다)
    Vertex Shader: 3D 공간산의 정점을 처리하는 로직
    Shading Language: GPU 디바이스 드라이버에 의해 IR(Intermeditate Represenation)으로 변환되는 언어

3. 랜더링의 종류

1. 오프라인 랜더링 (Offline, Unbiased) Rendering

오프라인 랜더링은 높은 퀄리티의 영상을 위해 실시간성을 희생한 랜더링이다. VFX(Visual Effects), 영화 애니메이션에서 사용된다.
Unbiased 랜더링은 통계적으로 실제 물리상황과 일치시키기 사용하는 로직이다. 시간의 제약 때문에, Offline에서도 Biased 방법을 사용할 수도 있다.
사용 언어:
ex) RenderMan, Houdini, Gelato, Open Shading Language
Open Shading Language (OSL)는 Sony Pictures Imageworks에서 개발했다. Sony Pictures Imageworks는 Sony Pictures의 자회사로 캐나다에서 스파이더맨의 CG 같은 것을 담당한 회사이다. 또한 Autodesk Arnold(아널드)에 Backbone이 되는 쉐이더 언어이다.

2. 리얼타임 랜더링 (Realtime, Biased) Rendering

실시간성을 중요시한 랜더링이다.

GLSL (OpenGL Shading Language)

OpenGL -> Architecture Review Board Assembly (IR, 요즘엔 SPIR-V) -> Any GPU

The High-Level Shading Language (HLSL)

DirectX High-Level Shader Language -> DirectX Shader Assembly Language

Metal Shading Language (MSL)

WebGPU Shading Language (WGSL)

Sony (플레이스테이션), Adobe 도 존재, Triton(OpenAI)

쉐이더 언어들은 서로 변환 가능하다. 그러나 특정 하드웨어나 쉐이더 언어에서 종속된 기능도 있다. ex) RTX코어

4. GPU로 명령이 가는 과정

SL (Shader Language) --컴파일러--> IR(Intermeditate Represenation) --디바이스 드라이버--> GPU
디바이스 드라이버는 하드웨어 특성에 맞춰 인스트럭션 순서를 재배치한다.

IR(Intermeditate Represenation)

SPIR-V(스피어-브이, Standard Portable Intermediate Representation, Vulkan용)나 DXIL/DXBC(DirectX용, window), PTX (Parallel Thread Execution, 엔비디아)는 GPU에 들어가기전의 Binary이다.디바이스 드라이버는 IR을 실제 기계어로 바꾼다. 이때 명령어의 순서를 바꾸고 메모리에 올리고 내리는 최적화를 진행한다.
GPU 디바이스 드라이버는 다양한 IR을 기계어로 바꿔 실행하게 해 준다.

GPU의 2가지 Input 형태 (Shader Language vs GPGPU, General Perpose GPU )

Shader Language는 Rendering PipeLine의 일부로 발전해 왔다. 즉 GPU를 병렬처리를 개인적인 연산으로 쓸려면 GPU 내부를 해킹해야 했다. 이때 사용한 용어가 GPGPU이다. 이 요구사항을 확인한 Nvidia는 2006년 CUDA를 만들어 최초의 Nvidia platform을 제어할 수 있는 장치를 만들었다. 덕분에 현재 CUDA가 가장 성숙한 기술력을 가지고 있게 됐다. 2012년, OpenGL 4.3도 후발 주자로 뛰어들었다. 그리고 이 GPGPU SW를 Compute Shader라 명명했다.
GPGPU 소프트웨어를 이용하면 C++과 같은 하이레벨 언어로 GPU에서 병렬처리가 가능하다. Nvidia의 CUDA, AMD의 ROCm가 있다. 이들을 활용하면 High Level 언어에서 Shader Language 없이 GPU를 활용할 수 있다.

Nvidia의 예시

CUDA는 GPU를 제어하는 언어 플랫폼이다. GPGPU()의 목적으로 쓰인다.
Kernel Nvidia는 상술한 Shader를 Kernel이라고 부른다. GPU에서 실행되는 연산 단위(로직 + 몇 개의 코어가 병렬로?)이다.
CRuntime API와 Driver API가 있다.

  • Runtime APInvcc라는 컴파일러를 쓴다. 이 컴파일러가 HLSL이나 CUDA Runtime API로 만든 코드를 PTX(IR)로 만든다. python 가상환경에서 CUDA-toolkit을 받으면 사용할 수 있다. ex) *. cu -> *. o Fatbinary -> GPU에 자동으로 로드
  • Driver API는 IR를 로드하는 과정까지 직접 짜야한다.
  • Nvidia는 GPGPU를 위한 CUDA, Graphic Programming을 위한 Graphics API가 있다.
    윈도에선 GPU드라이버에 두 가지 모드가 있다. WDDM (Windows Display Driver Model)은 그래픽스와 연산 둘 다 수행하는 모드이고 TCC (Tesla Compute Cluster)는 연산에 집중하는 모드이다. Linux에서는 headless를 활용하면 그래픽에 GPU연산이 들어가지 않게 된다.

https://illu.tistory.com/1507
https://en.wikipedia.org/wiki/Shader
https://en.wikipedia.org/wiki/Shading_language

반응형

'Engineering > Computer Graphics' 카테고리의 다른 글

Graphic 포스팅 계획 [취미]  (0) 2025.10.01