DirectX
DirectX는 으레 알고 있듯이 MS가 제공하는 API이며, GPU를 제어하고 프로그래밍을 할 수 있는 저수준 API이다. 이를 이용해 우리는 3차원 세계를 렌더링할 수 있는데, 대부분의 Windows 게임과 XBOX 게임은 DX를 사용하고 있다.
게임 프로그래머로 N차 전직을 하기 위해서는 필요한 기술 스택이라고 듣기도 했다. 선생님 왈 상용 엔진의 레이어만 다룰 것이 아니라면, 꼭 거쳐야하는 관문이라고 하셨다. 그리고 DX를 배우면 다른 API 또한 쉽게 배울 수 있다고 하셨다.
DX12가 전 버전에 비해서 달라진 것
DX12가 달라진 것은 간단하게 말하자면 더 저수준의 API가 되었다고 한다.
- Resource Binding => Root Signature / Descriptor Table
- Immediate Context => Command List & Command Queue
- State => ID3D12PipelineState
- Resource Transition => Resource Barrier
사실... 기존에 아는 게 별로 없어 무엇이 달라진지는 모르겠다. 아 슬프네. 저번 학기에 날 힘들게 했던 루트 시그니처와 서술자 테이블... 자원을 관리할 영역을 미리 할당하는 게 얼마나 귀찮았는지 모른다. 그 이름만으로도 훨씬 악랄한 API로 바뀌었다는 것을 알 수 있었다.
그럼 성능은 좋아졌을까?
추상화가 줄었고, 개발자가 관리해야할 영역이 훨씬 넓어졌다고 한다. 너무 슬프다 정말... 자원 하나 하나를 관리해야 한다는 건 정말이지 울고 싶을 만큼 귀찮고 복잡하다. 그렇지만, 더 빠르고 좋은 성능의 게임을 개발하기 위한 숙명이렷다...
수업하며 막 쓴 내용인데... 후에 정리할 예정!
DXGI (장치와 더 가까움)
D3D와 같은 게 아니다 (드라이버와 가까움)
GPU 세부사항 고려할 필요 X, 제조사-MS 협력
COM (Component Object Model)
=> ID3D12Device
ComPtr
GUID
ID 부여, 정수문자열
IID_PPV_ARGS
__uuidof(X), &X
더블버퍼링
백버퍼(채우는) + 프론트(출력)
DX=> Swap Chain (전면, 후면, Presenting)
전면과 후면의 포인터를 바꿔주기 위해
I + DXGI + Swap Chain
(장치 직접 제어 : DxGI)
필수!!
Present() 교체, 제시
ResizeBuffers()
깊이 버퍼링
깊이값 저장하는 텍스쳐
깊이 버퍼는 1280*1024 원소 가짐
Z-버퍼링
1) 먼 것 => 가까운 순서로 그림
정렬 오버헤드
맞물린 거 망함
2)깊이 버퍼링 알고리즘
약간 도장깨기
화면:깊이버퍼
=> 장치가 Depth Stencil Buffer
자원과 서술자
Resources
Resource Binding
500원.........
미리 얘네 사용할거야~
=> root signature
근데 메모리가 아니라 참조하는 Descriptor(서술자)를 접근
참조 주소 넘겨줌...
어떤 파이프라인에서 사용할지
CBV SRV 생성 => Descriptor
Descriptor Heap
서술자 배열
서술자들이 연결되어있다...
Root Signature
Heap을 Rendering Pipeline에 묶어주는 애
BIND
Descriptor Table
Descriptor Heap 관리
VIEW 아닌
Aliasing
계단현상
안티앨리어싱
1) 슈퍼샘플링 (초과표본화)
짱크게 한 다음 압축 (가로2배, 세로2배)
환원공정(Down Sampling) 평균 컬러
많은 계산 필요~~~
2) 멀티샘플링 (다중표본화)
네개의 픽셀을 하나의 픽셀로 친 후
평균 색상 구함
멀티샘플링은 DX에서 지원함~
상주성
최소화해서 View를 올림?
Command Queue
12
GPU => Command Queue
CPU => Command List
GPU 즉시 실행은 X
GPU 처리가 되면 실행
Command List를 통해 Command Queue에 삽입
=> ExecuteCommandLists
명령이 쌓이면 한번에 Queue로 옮김
Command List
GPU가 처리할 그래픽 연산들 넣음
Close 필요
동기화
GPU, CPU 속도를 맞추기 위함
Fence 다음 명령어가 들어오지 못하게~
자원 상태 전이 (더블버퍼링할 때~)
Resource hazard
읽기 가능한, 쓰기 가능한 상태인지 판별 => Resource Barrier
RENDERTARGET => 쓰기
PRESENT => 읽기
다 그리기 전에 가져가면 안 되니까~?~?
Pipeline State 제어...???
으앙 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
다중스레드 활용한다
여러개의 Command List > 하나의 Command Queue
멀티스레딩
Resource > GPU가 그리거나 읽는 거
'Direct X' 카테고리의 다른 글
[DX12] 빈 화면을 렌더링해보자! (1) | 2023.02.26 |
---|---|
[DX12] 장치를 초기화 해보자! (3) (RTV, DSV, Viewport) (0) | 2023.02.26 |
[DX12] 장치를 초기화 해보자! (2) (Command Object, Swap Chain) (0) | 2023.02.13 |
[DX12] 장치를 초기화 해보자! (1) (Device, Fence, Desc Size, MSAA) (0) | 2023.02.13 |
[DX12] DX12 프로그래밍 전 알아야 하는 것들 (0) | 2023.02.09 |