개요
💡 응용 프로그램에서 GPU를 제어하고 프로그래밍하는 데 쓰이는 저수준 그래픽 AP
→ 프로그램과 하드웨어 사이 Direct3D라는 간접층과 드라이버가 명령들을 GPU가 이해하는 기계어로 번역함
주요 기술
1. COM ( Component Object Model )
💡 DirectX의 프로그래밍 언어 독립성과 하위 호환성을 가능하게 하는 기술
- COM 인터페이스를 가리키는 포인터를 특별한 함수들을 이용, 메서드를 얻는 방법만 기용
- new로 생성할 필요 없지만, delete로 삭제하는 것이 아니라 인터페이스의 Release를 호출해야함
- IUnKnown이라는 기능을 상속해 Release를 제공, 참조카운팅 방식을 사용
- ComPtr이라는 스마트포인터를 사용
2. Swap Chain과 페이지 전환
💡 이중 버퍼링
전면과 후면 버퍼, 2가지 버퍼를 이용해 표시할 다음 프레임을 후면버퍼에 그려 완성 후 전환(포인터만 맞바꿈)해 ‘사용자에게 완성된 프레임만 보여주는 기법’ → presenting
- 두 버퍼는 하나의 Swap Chain을 형성
- IDXGISwapChain 인터페이스, 텍스처 2개와 크기 변경, presenting 메서드를 제공
스왑 체인의 예시 이미지
3. 깊이 버퍼링
이미지 자료를 담지 않는 텍스처의 한 예
- 각 픽셀의 깊이 정보를 저장
- 0~1까지 0은 관찰자와 가장 가깝고 1은 최대한 먼 픽셀에 해당
- 후면 버퍼의 해상도의 원소 숫자만큼 대응됨
- 과정
- 렌더링되는 각 픽셀의 깊이 값을 계산해 깊이 판정을 수행, 픽셀들의 깊이들을 비교
- 판정을 통해 관찰자와 가장 가까운 픽셀들 부터 후면 버퍼에 기록
4. Texture Resource View
텍스처를 렌더 대상으로 묶는 것 / 쉐이더 자원으로서 묶는 것
두 용도의 텍스처를 생성할 때 임의의 플래그를 사용
D3D11_BIND_RENDER_TARGET / D3D11_BIND_SHADER_RESOURCE
- DirectX3D에게 자원의 사용 방식을 전달
- 생성 시점에서 무형식을 지정한 자원 형식의 구체적 형식을 결정
- 텍스처 원소를 파이프라인 단계에선 부동소수점으로 사용하고 다른 단계에선 정수로서 사용하는 것이 가능함
- Bind 플래그 없이 생성한 특정 뷰는 에러를 야기
5. 다중 표본화 이론
앨리어싱(aliasing) 제거를 위한 기법으로 해상도를 키워 계단 현상을 없애는 대신 사용
- 초과표본화 (supersampling)
→ 비용이 큼
→ 후면 버퍼와 깊이 버퍼를 화면 해상도보다 4배 크게 잡아 화면에 presenting 할때 본래 크기로 환원
- 다중표본화 (multisampling)
→ 일부 계산 결과를 부분픽셀들 사이에서 공유하기 때문에 비용이 적음
→ 절충적 앨리어싱 제거 기법
→ 똑같이 4개로 늘리지만, 주변 4개의 픽셀값의 평균을 하나로 저장해 전달