Direct X
Graphics Rendering Pipeline
현재 배우고 있는 Direct X는
그래픽 API 중 하나이다
Graphics API
응용 프로그램 (ex : 게임, 3D 툴 등)과
하드웨어 사이를 이어주는 프로그래밍 인터페이스
개발자가 이들을 이용하여
‘삼각형 그리기’, ‘텍스쳐 적용’ 등의 명령을
GPU에게 내릴 수 있게 됨
(추상화)
-
- API(Application Programming Interface)
- 앱(어플레이케이션, 게임 등)을 프로그래밍할 때 사용하는
인터페이스(완충제, 창구 등) 를 총칭한다
(개발 도구의 일종)
(다른 개념 들 사이를 이어줄때 많이 이용)
-> 이 예시에서는 GPU를 이용할 때
각각의 그래픽 카드나 드라이버에 따라
코드를 고칠 수 없으니 Graphics API를 이용한다
(OpenGL, WebGL, Vulkan 등도 이와 같은 역할을 해준다)
(Vulkan : 차세데 API - 안드로이드 쪽의 렌더링할거면 공부!)
(Metal : 아이폰 쪽 렌더링 할거면 공부!)
(DirectX : Windows나 XBox 같은 Microsoft 쪽 계열의 공부!)
(dx 11 : OpenGL에 대응, dx 12 : Vulkan, Metal에 대응)
- API(Application Programming Interface)
Direct X
우리가 DirectX 의 여러 기능 중
가장 많이 사용할 것은 Direct 3D!
(DirectX 중 3D 그래픽스 API 를 담당)
대부분 그래픽스 자료 등에서
Direct X를 표현할 때
Direct 3D를 말하는 경우가 많으니 인지는 해둘 것
Graphics Driver (GPU Compiler 포함)
DirectX 같은 그래픽 API 에서 내려온 명령을
GPU가 이해할 수 있도록 ‘저수준 언어’으로 변환
-
- GPU Compiler
- HLSL(High-Level Shading Language) 같은 셰이더 코드를
GPU의 ISA(Instruction Set Architecture)로 변환
(ISA : 명령어 집합 구조)
(즉, 기계어 명령들로 변환하여 실행시킴)
- GPU Compiler
GPU (그래픽 처리 장치)
주어진 명령어를 실제로 실행하여 픽셀을 계산
- Command Processor: CPU에서 내려온 명령들을 스케줄링
- Shader Cores (SM, CU 등): 정점/픽셀/컴퓨트 셰이더 실행
- Rasterizer: 삼각형을 픽셀 단위로 잘라냄
- ROP (Render Output Units): 최종 색상/깊이 값을 계산하고 프레임 버퍼에 저장
병렬 처리가 가능하기에 한 번에 수천 개 이상의 스레드 실행 가능
보통 교재 등에서 나오는 그래픽 파이프라인 등은
‘GPU’ 내부 단계를 표현 하는 것
ex)
- Input Assembler – 정점(Vertex) 데이터 입력
- Vertex Shader – 각 정점 변환 (월드/뷰/투영 행렬)
- Tessellation / Geometry Shader – (선택적) 기하 분할, 도형 생성
- Rasterizer – 삼각형을 픽셀 단위로 쪼갬
- Pixel(Fragment) Shader – 각 픽셀 색상 계산 (조명, 텍스처 샘플링)
- Output Merger (ROP) – 깊이/스텐실/블렌딩 처리 → 프레임 버퍼 기록
등이 존재
(크게 IA -> VS -> RS -> PS -> OM 이며
세부 단계(ex : 테셀레이션,GS 등)가 중간에 더 존재)
Buffers(프레임 버퍼 / 백 버퍼)
GPU가 계산한 최종 픽셀 색을 담아두는 메모리 영역
ex)
- Color Buffer: 최종 RGBA 색상 값
- Depth Buffer: 픽셀 깊이 값(Z-buffer)
- Stencil Buffer: 마스킹용 값
더블 버퍼링 / 트리플 버퍼링?
화면에 출력 중인 버퍼(프런트 버퍼)와
GPU가 새로 그리는 버퍼(백 버퍼)를 교체하면서
깜빡임이나 티어링 방지
동기화?
V-Sync를 켜면 디스플레이 주사율(예: 60Hz)과 맞춰 버퍼 스왑
Display(모니터 등 출력장치)
GPU가 제공한 프레임 버퍼의 내용을
주기적으로 스캔하여 화면에 출력
-
- 주사율?
- 60Hz → 초당 60번 화면을 새로 그림 (1프레임 = 16.67ms)
모니터가 “언제” 프레임을 받아서 보여줄지 결정
- 주사율?
댓글남기기