다이렉트3D(영어:Direct3D)는 마이크로소프트 윈도우를 위한 그래픽 응용 프로그램 인터페이스(API)이다. DirectX의 일부인 Direct3D는 게임과 같이 성능이 중요한 애플리케이션에서 3차원 그래픽을 렌더링하는 데 사용된다. Direct3D는 그래픽 카드에서 지원하는 경우 하드웨어 가속을 사용하며, 이를 통해 전체 3D 렌더링 파이프라인이나 일부만 하드웨어 가속할 수 있다. Direct3D는 Z 버퍼링, W-버퍼링, 스텐실 버퍼링, 공간 위신호 제거, 알파 블렌딩, 색상 블렌딩, 밉맵핑, 텍스처 블렌딩, 클리핑, 컬링, 대기 효과, 원근 보정 텍스처 매핑, 프로그래밍 가능한 HLSL셰이더 및 효과를 포함한 3D 그래픽 하드웨어의 고급 그래픽 기능을 제공한다. 다른 DirectX 기술과의 통합을 통해 Direct3D는 비디오 매핑, 2D 비디오 오버레이 평면에서의 하드웨어 3D 렌더링, 심지어 스프라이트와 같은 기능을 제공하여 대화형 미디어에서 2D 및 3D 그래픽을 함께 사용할 수 있게 한다.
Direct3D는 3차원 컴퓨터 그래픽스 렌더링을 위한 많은 명령을 포함하고 있다. 하지만 버전 8부터는 다이렉트드로 프레임워크를 대체하고 2D 그래픽 렌더링에 대한 책임도 갖게 되었다. 마이크로소프트는 3D 그래픽 카드에서 사용할 수 있는 최신 기술을 지원하기 위해 Direct3D를 지속적으로 업데이트하고 있다. Direct3D는 완전한 정점 소프트웨어 에뮬레이션을 제공하지만, 하드웨어에서 지원하지 않는 기능에 대해서는 픽셀 소프트웨어 에뮬레이션을 제공하지 않는다. 예를 들어, Direct3D를 사용하여 프로그래밍된 소프트웨어가 픽셀 셰이더를 필요로 하는데 사용자의 컴퓨터에 있는 그래픽 카드가 해당 기능을 지원하지 않는 경우, Direct3D는 이를 에뮬레이트하지 않는다. 다만, 3D 모델의 폴리곤과 텍스처를 계산하고 렌더링할 수는 있으나, 하드웨어와 비교하면 대개 품질과 성능이 떨어진다. API에는 소프트웨어로 일반 그래픽 카드를 에뮬레이트하는 참조 래스터라이저(REF 장치)가 포함되어 있지만, 이는 대부분의 실시간 3D 애플리케이션에서 사용하기에는 너무 느리며 일반적으로 디버깅 용도로만 사용된다. Direct3D 10.1의 전체 기능 세트를 에뮬레이트하도록 설계된 새로운 실시간 소프트웨어 래스터라이저인 WARP는 윈도우 7 및 플랫폼 업데이트가 적용된 윈도우 비스타 서비스 팩 2에 포함되어 있으며, 멀티코어 CPU에서 저가형 3D 카드와 맞먹는 성능을 보여준다.
DirectX의 일부로서 Direct3D는 윈도우 95 이상에서 사용할 수 있으며, 다양한 버전의 엑스박스 콘솔 시스템의 벡터 그래픽스 API 기반이 된다. 여러 윈도우 API를 자유 소프트웨어로 다시 구현한 와인 호환 계층에는 Direct3D 구현이 포함되어 있다.
Direct3D의 주요 경쟁자는 크로노스의 OpenGL 및 그 후속인 벌컨이다. 페렌하이트는 1990년대에 마이크로소프트와 SGI가 OpenGL과 Direct3D를 통합하려는 시도였으나 결국 취소되었다.
1992년, 세르반 케온지안(Servan Keondjian), 더그 랍슨(Doug Rabson), 케이트 시킹스(Kate Seekings)는 렌더모픽스(RenderMorphics)라는 회사를 설립하여 의료 영상 및 CAD 소프트웨어에 사용되는 리얼리티 랩(Reality Lab)이라는 3D 그래픽 API를 개발했다.
이 API의 두 가지 버전이 출시되었다. 마이크로소프트는 1995년 2월에 렌더모픽스를 인수하고, 직원들을 영입하여 윈도우 95를 위한 3D 그래픽 엔진을 구현하게 했다. Direct3D의 첫 번째 버전은 DirectX 2.0(1996년 6월 2일)과 DirectX 3.0(1996년 9월 26일)에서 제공되었다.
Direct3D는 초기에 "즉시 모드" 3D API를 구현하고 그 위에 "보존 모드(retained mode)" 3D API를 계층화했다. 두 유형의 API 모두 Direct3D가 출시되기 전 리얼리티 랩의 두 번째 릴리스에서 이미 제공되었었다. 다이렉트드로와 같은 다른 DirectX API와 마찬가지로 둘 다 COM을 기반으로 했다. 보존 모드 API는 거의 채택되지 않은 장면 그래프 API였다. 게임 개발자들은 Direct3D 보존 모드가 제공할 수 있는 것보다 더 직접적인 하드웨어 제어를 원했다. 상당한 판매량을 기록한 게임 중 Direct3D 보존 모드를 기반으로 한 게임은 레고 아일랜드와 레고 락 레이더스뿐이었기 때문에 마이크로소프트는 DirectX 3.0 이후 보존 모드 API를 업데이트하지 않았다.
DirectX 2.0 및 3.0에서 Direct3D 즉시 모드는 하드웨어 벤더들이 직접 지원해주기를 희망했던 "실행 버퍼" 프로그래밍 모델을 사용했다. 실행 버퍼는 하드웨어 메모리에 할당되고 하드웨어가 3D 렌더링을 수행하기 위해 파싱하도록 의도되었다. 그러나 당시 프로그래밍하기가 매우 까다롭다고 여겨져 새로운 API의 채택을 방해했으며, 마이크로소프트가 게임과 워크스테이션 애플리케이션을 위한 공식 3D 렌더링 API로 OpenGL을 채택해야 한다는 요구를 불러일으켰다.
마이크로소프트는 게임 API로서 OpenGL을 채택하는 대신, OpenGL과 경쟁할 뿐만 아니라 3dfx의 글라이드와 같은 다른 독점 API와 더 효과적으로 경쟁하기 위해 Direct3D를 계속 개선하기로 선택했다.
처음부터 즉시 모드는 IDirect3DDevice 인터페이스의 BeginScene/EndScene 메서드를 사용하여 탈리스만의 타일 렌더링도 지원했다.
Direct3D 4.0
1996년 말 출시 예정이었다가 취소된 DirectX 4.0을 위해 Direct3D에 계획된 실질적인 변경 사항은 없었다.
Direct3D 5.0
1996년 12월, 레드먼드의 한 팀이 Direct3D 즉시 모드 개발을 맡았고, 런던에 기반을 둔 렌더모픽스 팀은 보존 모드 작업을 계속했다. 레드먼드 팀은 애플리케이션이 실행 버퍼를 구성할 필요를 없애주는 DrawPrimitive API를 추가하여 Direct3D가 글라이드 및 OpenGL과 같은 다른 즉시 모드 렌더링 API와 더 유사해지도록 만들었다. DrawPrimitive의 첫 번째 베타는 1997년 2월에 출시되었으며, 최종 버전은 1997년 8월 DirectX 5.0과 함께 출시되었다.
더 사용하기 쉬운 즉시 모드 API를 도입한 것 외에도, DirectX 5.0은 Direct3D 장치가 그래픽 출력을 다양한 다이렉트드로 서피스에 쓸 수 있도록 하는 SetRenderTarget 메서드를 추가했다.
Direct3D 6.0
1998년 8월에 출시된 DirectX 6.0은 최신 하드웨어를 지원하기 위한 수많은 기능(멀티텍스처 및 스텐실 버퍼 등)과 X87, SSE, 3D나우!를 위한 최적화된 지오메트리 파이프라인, 프로그래밍을 단순화하기 위한 선택적 텍스처 관리 기능을 도입했다. Direct3D 6.0에는 특정 하드웨어 벤더로부터 라이선스를 받아 API에 포함한 기능들에 대한 지원도 포함되었다. S3 텍스처 압축 지원이 그러한 기능 중 하나였으며, API 포함을 위해 DXTC로 이름이 변경되었다. 다른 하나는 TriTech의 독점 범프 매핑 기술이었다. 마이크로소프트는 이러한 기능을 DirectX에 포함한 다음, 다른 벤더 하드웨어에서도 널리 채택되도록 장려하기 위해 드라이버가 윈도우 로고를 받기 위한 필수 조건으로 추가했다.
1999년 2월 DirectX 6.1 업데이트에서 DirectX 6.0에 대한 사소한 업데이트가 있었다. 다이렉트뮤직 지원을 처음으로 추가한 것 외에도 이 릴리스는 인텔 펜티엄 III 3D 확장에 대한 지원을 개선했다.
1997년에 발송된 기밀 메모에는 마이크로소프트가 DirectX 6.0에서 탈리스만에 대한 전체 지원을 발표할 계획이었으나 해당 API는 취소된 것으로 나타나 있다 (자세한 내용은 마이크로소프트 탈리스만 문서 참조).
Direct3D 7.0
1999년 9월에 출시된 DirectX 7.0은 .dds 텍스처 형식을 도입하고 변환 및 조명(T&L) 하드웨어 가속(엔비디아의 지포스 256에서 PC 하드웨어로 처음 제공됨)과 하드웨어 메모리에 정점 버퍼를 할당하는 기능을 지원했다. 하드웨어 정점 버퍼는 DirectX 역사상 OpenGL보다 실질적으로 개선된 첫 번째 기능이다. Direct3D 7.0은 멀티텍스처링 하드웨어에 대한 DirectX 지원을 강화했으며 고정 기능 멀티텍스처 파이프라인 기능의 정점을 나타낸다. 비록 강력하지만 프로그래밍하기가 너무 복잡해서 그래픽 하드웨어의 셰이딩 기능을 활용하려면 새로운 프로그래밍 모델이 필요했다. Direct3D 7.0은 DXVA 기능도 도입했다.
Direct3D 8.0
2000년 11월에 출시된 DirectX 8.0은 정점 및 픽셀 셰이더 형태의 프로그래밍 가능성을 도입하여 개발자가 불필요한 하드웨어 상태를 걱정하지 않고 코드를 작성할 수 있게 했다. 셰이더 프로그램의 복잡성은 작업의 복잡성에 따라 달라지며, 디스플레이 드라이버는 이러한 셰이더를 하드웨어가 이해할 수 있는 명령어로 컴파일했다. Direct3D 8.0과 그 프로그래밍 가능한 셰이딩 기능은 복잡한 상태 머신에 의해 드로잉이 제어되는 OpenGL 스타일의 고정 기능 아키텍처로부터의 첫 번째 주요 탈피였다. 또한 Direct3D 8.0은 다이렉트드로를 별도의 API로 제거했다. Direct3D는 렌더링 결과를 표시하는 데 사용되는 Present()와 같이 애플리케이션 개발에 여전히 필요한 모든 나머지 다이렉트드로 API 호출을 흡수했다.
Direct3D는 사용자 친화적이지 않은 것으로 간주되었으나, DirectX 8.1 버전부터 많은 사용성 문제가 해결되었다. Direct3D 8은 정점 셰이더, 픽셀 셰이더, 안개(Distance fog), 범프 매핑, 텍스처 매핑과 같은 많은 강력한 3D 그래픽 기능을 포함하고 있었다.
Direct3D 9
2002년 12월에 출시된 Direct3D 9.0은 고급 셰이더 언어의 새 버전, 부동 소수점 텍스처 형식에 대한 지원, 다중 렌더 타겟(MRT), 다중 요소 텍스처, 정점 셰이더에서의 텍스처 조회 및 스텐실 버퍼 기술에 대한 지원을 추가했다.
Direct3D 9Ex
Direct3D 9Ex(이전 버전은 9.0L, 'L'은 윈도우 비스타의 코드명인 롱혼을 의미)는 윈도우 비스타 이상에서만 사용할 수 있는 확장 기능으로, 윈도우 비스타의 윈도우 디스플레이 드라이버 모델(WDDM)이 제공하는 이점을 활용하며 윈도우 에어로에 사용된다. Direct3D 9Ex는 DirectX 9 등급의 WDDM 드라이버와 함께 그래픽 메모리를 가상화하고 시스템 메모리로 페이징 아웃할 수 있게 하며, 그래픽 작업을 중단하고 예약하거나 프로세스 간에 DirectX 서피스를 공유할 수 있게 한다. Direct3D 9Ex는 이전에 Windows Graphics Foundation(WGF) 버전 1.0으로 알려져 있었다.
윈도우 비스타에는 Direct3D API에 대한 주요 업데이트가 포함되어 있다. 원래 WGF 2.0(Windows Graphics Foundation 2.0), 그 후 DirectX 10 및 DirectX Next로 불렸던 Direct3D 10은 업데이트된 셰이더 모델 4.0과 셰이더 프로그램을 위한 선택적 인터럽트 기능을 특징으로 한다. 이 모델에서 셰이더는 이전 버전과 마찬가지로 고정 스테이지로 구성되지만, 모든 스테이지는 거의 통합된 인터페이스를 지원하며 텍스처 및 셰이더 상수와 같은 리소스에 대한 통합된 액세스 패러다임을 지원한다. 언어 자체는 정수 연산, 크게 증가된 명령어 수, 더 C 언어와 유사한 구조를 포함하도록 확장되었다. 이전에 사용 가능했던 정점 및 픽셀 셰이더 스테이지 외에도, API에는 하나의 정점을 입력받아 하나의 정점을 출력하는 이전 모델을 깨고 셰이더 내부에서 지오메트리를 생성할 수 있게 하여 그래픽 하드웨어만으로 복잡한 지오메트리를 생성할 수 있도록 하는 지오메트리 셰이더 스테이지가 포함되어 있다.
윈도우 XP 및 그 이전 버전은 DirectX 10.0 이상을 지원하지 않는다. 또한 Direct3D 10은 처음부터 Direct3D의 일부였던 보존 모드 API에 대한 지원을 중단하여, 보존 모드 API를 렌더링 엔진으로 사용했던 3D 게임들과 윈도우 비스타 간의 비호환성을 야기했다.
이전 API 버전과 달리 Direct3D 10은 주어진 그래픽 장치에서 지원되는 기능을 나타내기 위해 "기능 비트"("캡")를 더 이상 사용하지 않는다. 대신 디스플레이 시스템이 "Direct3D 10 호환"이 되기 위해 지원해야 하는 최소 하드웨어 기능 표준을 정의한다. 이는 특정 기능의 존재 여부에 따라 능력 검사 코드와 특수 사례를 제거하여 애플리케이션 코드를 간소화하는 것을 목표로 하는 중요한 변화이다.
윈도우 비스타 초기 릴리스 이후 Direct3D 10 하드웨어가 상대적으로 드물었고 Direct3D 10을 호환하지 않는 그래픽 카드의 설치 기반이 거대했기 때문에, 최초의 Direct3D 10 호환 게임들은 여전히 Direct3D 9 렌더 경로를 제공한다. 이러한 타이틀의 예로는 원래 Direct3D 9용으로 작성되었다가 출시 후 Direct3D 10으로 포팅된 컴퍼니 오브 히어로즈나, 원래 Direct3D 9용으로 개발되었다가 개발 후반부에 Direct3D 10 경로를 소급 적용한 헬게이트: 런던 또는 크라이시스가 있다. DirectX 10 SDK는 2007년 2월에 출시되었다.
Direct3D 10.0
Direct3D 10.0 수준의 하드웨어는 다음 기능을 지원해야 한다: 새로운 지오메트리 셰이더 스테이지에서 전체 프리미티브를 처리하는 기능, 스트림 출력 스테이지를 사용하여 파이프라인에서 생성된 정점 데이터를 메모리로 출력하는 기능, 멀티샘플 알파-투-커버리지 지원, 뎁스/스텐실 서피스나 멀티샘플 리소스가 더 이상 렌더 타겟으로 바인딩되지 않을 때 읽기, 전체 HLSL 통합 (모든 Direct3D 10 셰이더는 HLSL로 작성되고 공통 셰이더 코어로 구현됨), 정수 및 비트 단위 셰이더 연산, 파이프라인 상태를 5개의 불변 상태 객체로 구성, 셰이더 상수를 상수 버퍼로 구성, 렌더 타겟, 텍스처 및 샘플러 수 증가, 셰이더 길이 제한 없음, 새로운 리소스 유형 및 리소스 형식, 계층화된 런타임/API 계층, 지오메트리 셰이더를 사용하여 프리미티브별 재질 교체 및 설정 수행 옵션, 뷰를 사용하여 리소스 액세스의 일반화 증가, 레거시 하드웨어 기능 비트 (캡) 제거.
고정 파이프라인은 이를 에뮬레이트하도록 프로그래밍할 수 있는 완전 프로그래밍 가능 파이프라인 (종종 통합 파이프라인 아키텍처라고 함)으로 대체되고 있다.
조건부 렌더링(Predicated rendering)을 통해 다른 조건에 따라 드로우 호출이 무시될 수 있다. 이를 통해 개체가 보이지 않거나 너무 멀리 있어 보이지 않을 경우 렌더링되지 않도록 하는 신속한 오클루전 컬링이 가능하다.
인스턴싱 2.0 지원으로 군대, 풀, 나무와 같은 유사한 메시의 여러 인스턴스를 단일 드로우 호출로 렌더링할 수 있어 여러 유사한 개체에 필요한 처리 시간을 단일 개체 수준으로 줄일 수 있다.
Direct3D 10.1
Direct3D 10.1은 Direct3D 10 출시 직후 마이크로소프트가 마이너 업데이트로 발표했다. 사양은 2007년 11월 DirectX SDK 릴리스와 함께 확정되었으며, 런타임은 2008년 3월 중순부터 제공되는 윈도우 비스타 서비스 팩 1과 함께 배포되었다.
Direct3D 10.1은 그래픽 벤더를 위해 몇 가지 이미지 품질 표준을 설정하고 개발자에게 이미지 품질에 대한 더 많은 제어권을 제공한다. 기능에는 안티앨리어싱 (샘플별 셰이딩 및 샘플 위치에 대한 애플리케이션 제어를 통한 멀티샘플링 및 슈퍼샘플링 모두)에 대한 더 정밀한 제어와 기존 기능 중 일부에 대한 더 많은 유연성 (큐브맵 배열 및 독립적인 블렌딩 모드)이 포함된다. Direct3D 10.1 수준의 하드웨어는 다음 기능을 지원해야 한다: 멀티샘플링은 커버리지 기반 투명도를 일반화하고 멀티 패스 렌더링에서 더 효과적으로 작동하도록 향상되었다. 더 나은 컬링 동작 – 제로 영역 면은 자동으로 컬링된다; 이는 와이어프레임 렌더링에만 영향을 준다. 렌더 타겟당 독립적인 블렌드 모드, 프리미티브 래스터화와 함께 새로운 샘플 빈도 픽셀 셰이더 실행, 파이프라인 스테이지 대역폭 증가. 컬러 및 뎁스/스텐실 MSAA 서피스 모두 이제 CopyResource와 함께 소스 또는 대상으로 사용할 수 있다. MultisampleEnable은 라인 래스터화에만 영향을 주며 (포인트 및 삼각형은 영향을 받지 않음), 라인 드로잉 알고리즘을 선택하는 데 사용된다. 이는 Direct3D 10의 일부 멀티샘플 래스터화가 더 이상 지원되지 않음을 의미한다. 텍스처 샘플링 – sample_c 및 sample_c_lz 명령은 Texture2DArrays 및 TextureCubeArrays 모두와 함께 작동하도록 정의되며 Location 멤버 (알파 구성 요소)를 사용하여 배열 인덱스를 지정한다. TextureCubeArrays 지원.
Direct3D 10-클래스 하드웨어 및 드라이버 인터페이스를 엄격히 요구했던 Direct3D 10과 달리, Direct3D 10.1 런타임은 "기능 수준" 개념을 사용하여 Direct3D 10.0 하드웨어에서 실행될 수 있지만, 새로운 기능은 기능 수준 10_1을 노출하는 새로운 하드웨어에서만 독점적으로 지원된다.
Direct3D 11은 윈도우 7의 일부로 출시되었다. 2008년 7월 22일 게임페스트(Gamefest) 2008에서 발표되었고 2008년 8월 26일 Nvision 08 기술 컨퍼런스에서 시연되었다. Direct3D 11 기술 프리뷰는 2008년 11월 릴리스된 DirectX SDK에 포함되었다. AMD는 2009년 6월 3일 컴퓨텍스(Computex)에서 DirectX 11 SDK 샘플을 실행하는 DirectX 11 하드웨어를 미리 선보였다.
Direct3D 11 런타임은 Direct3D 10.1 런타임에서 처음 도입된 기능의 확장 개념인 "기능 수준"을 사용하여 Direct3D 9 및 10.x 클래스 하드웨어 및 드라이버에서 실행될 수 있다. 기능 수준을 통해 개발자는 Direct3D 11 API 아래에서 렌더링 파이프라인을 통합하고 보급형 카드에서도 더 나은 리소스 관리 및 멀티스레딩과 같은 API 개선 사항을 사용할 수 있지만, 새로운 셰이더 모델 및 렌더링 스테이지와 같은 고급 기능은 상위 하드웨어에서만 노출된다. 인기 있는 DirectX 9.0a 카드의 다양한 기능을 캡슐화하는 세 가지 "10 수준 9" 프로필이 있으며, Direct3D 10, 10.1 및 11 각각은 별도의 기능 수준을 가진다. 각 상위 수준은 하위 수준의 엄격한 상위 집합이다.
테셀레이션은 이전에 Direct3D 10을 위해 고려되었으나 나중에 폐기되었다. 라데온 R600과 같은 GPU는 Direct3D 9/10/10.1 및 OpenGL과 함께 사용할 수 있는 테셀레이션 엔진을 특징으로 하지만, 마이크로소프트에 따르면 Direct3D 11과는 호환되지 않는다. 라데온 8xxx, 지포스 3/4와 같은 구형 그래픽 하드웨어는 다른 형태의 테셀레이션(RT 패치, N 패치)을 지원했지만, 이러한 기술은 실질적인 사용을 보지 못했다. 따라서 더 새로운 하드웨어에서는 지원이 중단되었다.
마이크로소프트는 또한 순서 독립적 투명도(order independent transparency)와 같은 다른 기능들을 암시했지만, 이는 Direct3D API에 의해 노출된 적이 없으며 비디오로직의 파워VR 칩 라인과 같은 초기 Direct3D 하드웨어에서 거의 투명하게 지원되었다.
Direct3D 11.0
Direct3D 11.0 기능에는 다음이 포함된다: 셰이더 모델 5.0 지원, 동적 셰이더 링킹, 주소 지정 가능 리소스, 추가 리소스 유형, 서브루틴, 지오메트리 인스턴싱, 픽셀 셰이더 입력으로서의 커버리지, 입력의 프로그래밍 가능한 보간, 새로운 텍스처 압축 형식 (새로운 LDR 형식 1개 및 HDR 형식 1개), WDDM 프리로드를 제한하기 위한 텍스처 클램프, 텍스처 필터링에서 8비트 하위 텍셀 및 하위 밉 정밀도 요구, 16K 텍스처 제한, Gather4(다중 구성 요소 텍스처 지원, 프로그래밍 가능한 오프셋 지원), DrawIndirect, 보수적 oDepth, 뎁스 바이어스, 주소 지정 가능 스트림 출력, 리소스별 밉맵 클램핑, 부동 소수점 뷰포트, 셰이더 변환 명령어, 향상된 멀티스레딩.
셰이더 모델 5
테셀레이션 및 테셀레이션 셰이더 지원 — 낮은 세부 수준의 폴리곤 모델에서 런타임 시 가시적인 폴리곤 수를 증가시킴
멀티스레드 렌더링 — 멀티코어 CPU를 위해 서로 다른 스레드에서 동일한 Direct3D 장치 객체로 렌더링함
Direct3D 11.1은 윈도우 8과 함께 제공되는 API 업데이트이다. 윈도우 8의 Direct3D 런타임은 DXGI 1.2를 특징으로 하며 새로운 WDDM 1.2 장치 드라이버가 필요하다. 윈도우 8 개발자 프리뷰용 윈도우 SDK 예비 버전은 2011년 9월 13일에 출시되었다.
새로운 API는 셰이더 트레이싱 및 HLSL 컴파일러 향상, 최소 정밀도 HLSL 스칼라 데이터 유형 지원, 모든 파이프라인 스테이지에서의 UAV(Unordered Access Views), 타겟 독립적 래스터화(TIR), NO_OVERWRITE로 동적 버퍼의 SRV를 매핑하는 옵션, 비디오 리소스의 셰이더 처리, 렌더 타겟에서 논리 연산을 사용할 수 있는 옵션, 상수 버퍼의 하위 범위를 셰이더에 바인딩하고 검색할 수 있는 옵션, 셰이더가 액세스할 수 있는 것보다 큰 상수 버퍼를 생성할 수 있는 옵션, 리소스 및 리소스 뷰를 삭제할 수 있는 옵션, 새로운 복사 옵션으로 하위 리소스를 변경할 수 있는 옵션, 래스터라이저 상태를 생성하기 위해 샘플 수를 강제할 수 있는 옵션, 리소스 뷰의 전체 또는 일부를 지울 수 있는 옵션, 세션 0 프로세스에서 Direct3D를 사용할 수 있는 옵션, 기능 수준 9 이상에서 HLSL로 사용자 클립 평면을 지정할 수 있는 옵션, 기능 수준 9에서 섀도 버퍼 지원, 비디오 재생 지원, 공유 Texture2D 리소스에 대한 확장 지원, Direct3D 10 컨텍스트와 11 컨텍스트 및 기능 수준 간의 즉시 전환 옵션을 특징으로 한다. Direct3D 11.1에는 새로운 기능 수준 11_1이 포함되어 있어 셰이더 언어에 대한 사소한 업데이트 (더 큰 상수 버퍼 및 선택적 배정밀도 명령어 등)뿐만 아니라 개선된 블렌딩 모드와 인텔 HD 그래픽스와 같은 저가형 GPU의 성능을 향상시키기 위한 16비트 컬러 형식에 대한 필수 지원을 제공한다. WARP는 기능 수준 11_1을 지원하도록 업데이트되었다.
윈도우 7용 플랫폼 업데이트에는 Direct3D 11.1의 제한된 기능 세트가 포함되어 있지만, 기능 수준 11_1 및 관련 API나 스테레오스코픽 렌더링을 위한 쿼드 버퍼링과 같이 WDDM 1.2에 의존하는 구성 요소는 존재하지 않는다.
Direct3D 11.2
Direct3D 11.2는 윈도우 8.1과 함께 배포되었다. 새로운 하드웨어 기능에는 WDDM 1.3 드라이버가 포함된 DXGI 1.3이 필요하며 런타임 셰이더 수정 및 링킹, 함수 링킹 그래프(FLG), 수신함 HLSL 컴파일러, 그래픽 명령 주석 옵션이 포함되어 있다. 기능 수준 11_0 및 11_1은 셰이더 상세 수준 클램프 (티어 2)와 함께 타일 리소스에 대한 선택적 지원을 도입한다. 후자의 기능은 현재 많은 GPU에 존재하는 하드웨어 페이지 테이블에 대한 제어를 효과적으로 제공한다. WARP는 새로운 기능을 완전히 지원하도록 업데이트되었다. 기능 수준 11_2는 없으며, 새로운 기능은 기존 기능 수준 전반에 걸쳐 분산되어 있다. 하드웨어 종속적인 기능은 CheckFeatureSupport를 통해 개별적으로 확인할 수 있다. Direct3D 11.2의 일부 "새로운" 기능은 실제로는 일부 구형 하드웨어 기능을 더 세분화된 방식으로 노출한다. 예를 들어 D3D11_FEATURE_D3D9_SIMPLE_INSTANCING_SUPPORT는 기능 수준 9_1 및 9_2 하드웨어에서 인스턴싱에 대한 부분 지원을 노출하며, 이는 기능 수준 9_3 이상에서는 완전히 지원된다.
Direct3D 11.X
Direct3D 11.X는 엑스박스 원에서 실행되는 DirectX 11.2의 상위 집합이다. 여기에는 나중에 DirectX 12의 일부로 발표된 드로우 번들과 같은 일부 기능이 포함되어 있다.
Direct3D 11.3
Direct3D 11.3은 2015년 7월 윈도우 10과 함께 출시되었다. Direct3D 11.x API의 전체 구조를 유지하면서 Direct3D 12의 마이너 렌더링 기능이 포함되어 있다. Direct3D 11.3은 선택적 셰이더 지정 스텐실 참조 값, 유형화된 순서 없는 액세스 뷰 로드, 래스터라이저 순서 뷰(ROV), 선택적 표준 스위즐, 선택적 기본 텍스처 매핑, 보수적 래스터화 (세 가지 티어 중), 선택적 통합 메모리 액세스(UMA) 지원 및 추가 타일 리소스 (티어 2)(볼륨 타일 리소스)를 도입한다.
Direct3D 11.4
Direct3D 11.4 버전 1511 – 초기 Direct3D 11.4는 윈도우 10 Threshold 2 업데이트 (버전 1511)와 함께 도입되어 외부 그래픽 어댑터 지원 및 DXGI 1.5가 개선되었다.
Direct3D 11.4 버전 1607 – 윈도우 10 Anniversary 업데이트 (버전 1607)와 함께 업데이트된 Direct3D 11.4는 WDDM 2.1 지원 및 UHDTV HDR10 형식(ST 2084) 지원, UWP 애플리케이션에 대한 가변 주사율 지원을 포함한다.
Direct3D 12는 이전 버전보다 낮은 수준의 하드웨어 추상화를 허용하여 향후 애플리케이션이 멀티스레드 스케일링을 크게 개선하고 CPU 활용도를 낮출 수 있도록 한다. 이는 간접 드로잉, 디스크립터 테이블, 간결한 파이프라인 상태 객체 및 드로우 호출 번들과 같은 새로운 기능을 통해 Direct3D 추상화 계층을 기본 하드웨어와 더 잘 일치시킴으로써 달성된다. 드라이버 오버헤드를 줄이는 것은 AMD의 맨틀과 마찬가지로 Direct3D 12의 주요 매력이다. 수석 개발자 맥스 맥멀렌(Max McMullen)의 말에 따르면, Direct3D 12의 주요 목표는 "콘솔 수준의 효율성"과 개선된 CPU 병렬성을 달성하는 것이다.
엔비디아는 Direct3D 12에 대한 광범위한 지원을 발표했지만, 게임 엔진 개발자는 애플리케이션 코드에서 직접 GPU 리소스를 관리하는 데 열광할 수 있는 반면, "다른 많은 사람들"은 그렇게 해야 하는 것에 만족하지 않을 것이라고 언급하며 새로운 API의 보편적인 매력에 대해서는 다소 유보적인 입장을 보였다.
일부 새로운 하드웨어 기능도 Direct3D 12에 포함되어 있다, 여기에는 셰이더 모델 5.1, 볼륨 타일 리소스 (티어 2), 셰이더 지정 스텐실 참조 값, 유형화된 UAV 로드, 보수적 래스터화 (티어 1), 보수적 래스터화를 이용한 더 나은 충돌 및 컬링, 래스터라이저 순서 뷰(ROV), 표준 스위즐, 기본 텍스처 매핑, 스왑 체인, 스위즐 리소스 및 압축 리소스, 추가 블렌드 모드, 프로그래밍 가능한 블렌딩 및 픽셀 순서 UAV를 사용한 효율적인 순서 독립적 투명도(OIT)가 포함된다.
파이프라인 상태 객체(PSO)는 Direct3D 11에서 진화했으며, 새로운 간결한 파이프라인 상태는 프로세스가 단순화되었음을 의미한다. DirectX 11은 성능을 저해하면서 상태를 변경하는 방법에 대한 유연성을 제공했다. 프로세스를 단순화하고 파이프라인 (예: 픽셀 셰이더 상태)을 통합함으로써 프로세스가 더 간소화되어 오버헤드를 크게 줄이고 그래픽 카드가 각 프레임에 대해 더 많은 호출을 그릴 수 있게 되었다. 일단 생성되면 PSO는 변경할 수 없다.
루트 서명은 명령어 목록을 셰이더에 필요한 리소스에 연결하는 구성을 도입한다. 이는 셰이더가 사용할 리소스의 레이아웃을 정의하고 어떤 리소스가 파이프라인에 바인딩될지 지정한다. 그래픽 명령어 목록은 그래픽 및 컴퓨트 루트 서명을 모두 가지는 반면, 컴퓨트 명령어 목록은 컴퓨트 루트 서명만 가진다. 이러한 루트 서명은 서로 완전히 독립적이다. 루트 서명은 셰이더가 사용할 데이터 유형을 레이아웃하지만 실제 메모리나 데이터를 정의하거나 매핑하지는 않는다.
루트 파라미터는 루트 서명의 한 가지 유형의 항목이다. 런타임에 수정되는 루트 파라미터의 실제 값을 루트 인수라고 한다. 이것이 셰이더가 읽는 데이터이다.
Direct3D 11 내에서 명령은 CPU에서 GPU로 하나씩 전송되며, GPU는 이러한 명령을 순차적으로 처리한다. 이는 명령이 CPU가 선형 방식으로 전송할 수 있는 속도에 의해 병목 현상이 발생함을 의미한다. DirectX 12 내에서 이러한 명령은 단일 패키지 내의 모든 필수 정보를 포함하는 명령어 목록으로 전송된다. GPU는 CPU로부터 추가 정보를 기다릴 필요 없이 단일 프로세스에서 이 명령을 계산하고 실행할 수 있다.
이러한 명령어 목록 안에는 번들이 있다. 이전에는 명령이 GPU에 의해 취해지고 사용된 다음 잊혀졌으나, 번들은 재사용될 수 있다. 이는 GPU의 작업량을 줄여주며 반복되는 에셋을 훨씬 더 빠르게 사용할 수 있음을 의미한다.
Direct3D 11에서 리소스 바인딩은 현재 개발자들에게 상당히 편리하지만, 그 비효율성은 여러 현대적인 하드웨어 기능이 지나치게 과소평가되고 있음을 의미한다. 게임 엔진이 DX11에서 리소스를 필요로 할 때마다 매번 데이터를 처음부터 그려야 했으므로 반복적인 프로세스와 불필요한 사용을 의미했다. Direct3D 12에서 디스크립터 힙과 테이블은 가장 자주 사용되는 리소스를 개발자가 GPU가 쉽고 빠르게 액세스할 수 있는 테이블에 할당할 수 있음을 의미한다. 이는 동일한 하드웨어에서 Direct3D 11보다 더 나은 성능에 기여할 수 있지만, 개발자에게는 더 많은 작업이 필요하다.
동적 힙 또한 Direct3D 12의 기능이다.
Direct3D 12는 명시적 멀티 어댑터 지원을 특징으로 하며, 다중 GPU(mGPU) 구성 시스템에 대한 명시적인 제어를 허용한다. 이러한 구성은 동일한 하드웨어 벤더뿐만 아니라 서로 다른 하드웨어 벤더의 그래픽 어댑터로도 구축할 수 있다.
윈도우 7 SP1에 대한 D3D 12의 실험적 지원은 마이크로소프트에 의해 2019년에 전용 NuGet 패키지를 통해 출시되었다.
Direct3D 12 버전 1607 – 2016년 8월 2일에 출시된 윈도우 10 Anniversary 업데이트 (버전 1607)와 함께 Direct3D 12 런타임이 업데이트되어 명시적 멀티스레딩 및 프로세스 간 통신을 위한 구조를 지원하며, 개발자가 현대적인 대규모 병렬 GPU를 활용할 수 있게 되었다. 다른 기능으로는 업데이트된 루트 서명 버전 1.1과 HDR10 형식 및 가변주사율 지원이 있다.
Direct3D 12 버전 1703 – 2017년 4월 11일에 출시된 윈도우 10 크리에이터스 업데이트 (버전 1703)와 함께 Direct3D 12 런타임이 업데이트되어 셰이더 모델 6.0 및 DXIL을 지원한다. 셰이더 모델 6.0은 윈도우 10 Anniversary 업데이트 (버전 1607) 및 WDDM 2.1이 필요하다. 새로운 그래픽 기능으로 뎁스 바운드 테스팅 및 프로그래밍 가능한 MSAA가 있다.
Direct3D 12 버전 1709 – 2017년 10월 17일에 출시된 윈도우 10 Fall 크리에이터스 업데이트 (버전 1709)의 Direct3D는 디버깅 기능이 향상되었다.
Direct3D 12 버전 1809 – 윈도우 10 2018년 10월 업데이트 (버전 1809)는 DirectX 레이트레이싱을 지원하여 GPU가 해당 API의 이점을 누릴 수 있게 한다.
Direct3D 12 버전 1903 – 윈도우 10 2019년 5월 업데이트 (버전 1903)는 DirectML 및 NPU를 지원한다. DirectML은 컴퓨트 셰이더와 텐서 셰이더를 모두 지원할 수 있다.
Direct3D 12 버전 2004 – 윈도우 10 2020년 5월 업데이트 (버전 2004)는 DirectX 12 얼티밋, 메시 및 증폭 셰이더, 샘플러 피드백, DirectX 레이트레이싱 티어 1.1 및 메모리 할당 개선 사항을 지원한다.
Direct3D 12 버전 21H2 – 윈도우 10 버전 21H2 및 윈도우 11 버전 21H2는 DirectStorage를 지원한다.
아키텍처
Abstract Layer
Direct3D는 마이크로소프트 DirectX API 하위 시스템 구성 요소이다. Direct3D의 목적은 그래픽 애플리케이션과 그래픽 하드웨어 드라이버 간의 통신을 추상화하는 것이다. 이는 GDI와 비교할 수 있는 수준의 얇은 추상 계층으로 제공된다 (첨부된 다이어그램 참조). Direct3D는 GDI가 부족한 수많은 기능을 포함하고 있다.
Direct3D는 즉시 모드 그래픽 API이다. 모든 비디오 카드 3D 기능(변환, 클리핑, 조명, 재질, 텍스처, 깊이 버퍼링 등)에 대한 저레벨 인터페이스를 제공한다. 한때는 고레벨의 보존 모드 구성 요소가 있었으나, 현재는 공식적으로 중단되었다.
Direct3D 즉시 모드는 장치, 리소스 및 스왑 체인이라는 세 가지 주요 추상화를 제공한다 (첨부된 다이어그램 참조). 장치는 3D 장면 렌더링을 담당한다. 장치는 서로 다른 렌더링 기능을 갖춘 인터페이스를 제공한다. 예를 들어, 모노 장치는 흰색과 검은색 렌더링을 제공하는 반면, RGB 장치는 색상으로 렌더링한다. 장치에는 네 가지 유형이 있다:
풀: 런타임에 의해 리소스가 관리되는 방식과 저장되는 위치를 설명한다. 기본 풀에서 리소스는 장치 메모리에만 존재한다. 관리형 풀의 리소스는 시스템 메모리에 저장되며 필요할 때 장치로 전송된다. 시스템 메모리 풀의 리소스는 시스템 메모리에만 존재한다. 마지막으로 스크래치 풀은 기본적으로 시스템 메모리 풀과 같지만 리소스가 하드웨어 제한을 받지 않는다.
형식: 메모리에 있는 리소스 데이터의 레이아웃을 설명한다. 예를 들어 D3DFMT_R8G8B8 형식 값은 24비트 색 깊이를 의미한다 (빨간색 8비트, 녹색 8비트, 파란색 8비트).
사용량: 플래그 비트 컬렉션과 함께 애플리케이션에서 리소스가 사용되는 방식을 설명한다. 이러한 플래그는 동적 또는 정적 액세스 패턴에서 어떤 리소스가 사용되는지를 결정한다. 정적 리소스 값은 로드된 후 변경되지 않지만, 동적 리소스 값은 수정될 수 있다.
Direct3D는 두 가지 디스플레이 모드를 구현한다:
전체 화면 모드: Direct3D 애플리케이션은 디스플레이 장치에 대한 모든 그래픽 출력을 생성한다. 이 모드에서 Direct3D는 프로그래머의 개입 없이 자동으로 Alt-Tab을 캡처하고 화면 해상도 및 픽셀 형식을 설정/복원한다. 이는 '독점 협력 모드'로 인해 디버깅에 많은 문제를 제공한다.
창 모드: 결과가 창 영역 내에 표시된다. Direct3D는 디스플레이에서 그래픽 출력을 생성하기 위해 GDI와 통신한다. 창 모드는 드라이버 지원에 따라 전체 화면과 동일한 수준의 성능을 가질 수 있다.
파이프라인
Direct3D 11 graphics pipeline process
마이크로소프트 Direct3D 11 API는 정점, 텍스처, 버퍼 및 상태 그룹을 화면의 이미지로 변환하는 프로세스를 정의한다. 이 프로세스는 몇 개의 뚜렷한 스테이지가 있는 렌더링 파이프라인으로 설명된다. Direct3D 11 파이프라인의 다양한 스테이지는 다음과 같다:
입력-어셈블러: 애플리케이션에서 제공하는 정점 버퍼에서 정점 데이터를 읽어 파이프라인으로 보낸다.
정점 셰이더: 변환, 스키닝 또는 조명과 같이 한 번에 하나의 정점에 대해 작업을 수행한다.
헐-셰이더: 패치 제어 포인트 세트에 대해 작업을 수행하고 패치 상수라고 하는 추가 데이터를 생성한다.
테셀레이터: 지오메트리를 세분화하여 헐의 고차 표현을 생성한다.
도메인-셰이더: 테셀레이션 스테이지에서 출력된 정점에 대해 정점 셰이더와 거의 동일한 방식으로 작업을 수행한다.
지오메트리 셰이더: 삼각형, 포인트 또는 선과 같은 전체 프리미티브를 처리한다. 프리미티브가 주어지면 이 스테이지는 이를 폐기하거나 하나 이상의 새로운 프리미티브를 생성한다.
스트림-출력: 이전 스테이지의 결과를 메모리에 쓸 수 있다. 이는 데이터를 파이프라인으로 다시 순환시키는 데 유용하다.
래스터라이저: 프리미티브를 픽셀로 변환하고 이 픽셀을 픽셀 셰이더로 보낸다. 래스터라이저는 또한 보이지 않는 것을 클리핑하거나 정점 데이터를 픽셀당 데이터로 보간하는 등의 다른 작업을 수행할 수 있다.
픽셀 셰이더: 렌더 타겟에 기록될 최종 픽셀 색상을 결정하며 깊이 버퍼에 기록될 깊이 값을 계산할 수도 있다.
출력-머저: 최종 결과를 만들기 위해 다양한 유형의 출력 데이터(픽셀 셰이더 값, 알파 블렌딩, 깊이/스텐실 등)를 병합한다.
둥근 상자로 예시된 파이프라인 스테이지는 완전히 프로그래밍 가능하다. 애플리케이션은 해당 스테이지에 대해 완료될 정확한 작업을 설명하는 셰이더 프로그램을 제공한다. 많은 스테이지는 선택 사항이며 완전히 비활성화될 수 있다.
Direct3D 5에서 9까지, 새로운 버전의 API가 새로운 하드웨어 기능을 지원하게 되었을 때, 대부분은 선택 사항이었다. 각 그래픽 벤더는 기본 필수 기능을 외에 자신만의 지원 기능 세트를 유지했다. 개별 기능에 대한 지원은 "기능 비트" 또는 "캡"을 사용하여 결정해야 했으며, 이는 교차 벤더 그래픽 프로그래밍을 복잡한 작업으로 만들었다.
Direct3D 10은 지원되는 텍스처 형식 및 작업에 대한 몇 가지 선택적 기능만 있는, 대부분의 그래픽 카드가 준수해야 하는 가장 인기 있는 Direct3D 9 기능을 기반으로 한 훨씬 단순화된 필수 하드웨어 요구 사항 세트를 도입했다.
Direct3D 10.1은 몇 가지 새로운 필수 하드웨어 요구 사항을 추가했으며, 10.0 하드웨어 및 드라이버와 호환성을 유지하기 위해 이러한 기능은 "기능 수준"이라는 두 세트로 캡슐화되었으며, 10.1 수준은 10.0 수준의 상위 집합을 형성했다. Direct3D 11.0, 11.1 및 12가 새로운 하드웨어 지원을 추가함에 따라 새로운 필수 기능은 더 높은 기능 수준으로 그룹화되었다.
Direct3D 11은 또한 WDDM드라이버를 사용하는 다양한 Direct3D 9 카드를 캡슐화하는 세 가지 기능 수준을 가진 Direct3D 10 API의 하위 집합인 "10level9"를 도입했으며, Direct3D 11.1은 Direct3D 11.2 및 이후 버전에서 확장된 모든 수준에 대한 몇 가지 선택적 기능을 다시 도입했다.
이 접근 방식을 통해 개발자는 렌더링 파이프라인을 통합하고 최신 런타임의 성능 및 사용성 향상을 활용하여 새로운 하드웨어와 이전 하드웨어 모두에서 단일 API 버전을 사용할 수 있다.
새로운 기능 수준은 업데이트된 API 버전과 함께 도입되며 일반적으로 다음을 캡슐화한다:
주요 필수 기능 – (Direct3D 11.0, 12),
몇 가지 사소한 기능 (Direct3D 10.1, 11.1), 또는
이전에 선택 사항이었던 기능의 공통 세트 (Direct3D 11.0 "10 수준 9").
각 상위 수준은 하위 수준의 엄격한 상위 집합이며, 핵심 기능으로 이동하는 소수의 새로운 기능이나 이전에 선택적이었던 기능만 상위 수준에 포함된다. 새로운 셰이더 모델 및 렌더링 스테이지와 같은 Direct3D API의 주요 개정판에 포함된 더 고급 기능은 상위 수준 하드웨어에서만 노출된다.
특정 텍스처 작업 및 리소스 형식에 대한 지원을 나타내기 위해 별도의 기능이 존재하며, 이는 기능 플래그의 조합을 사용하여 각 텍스처 형식별로 지정된다.
기능 수준은 밑줄을 구분 기호로 사용하고("12_1"), API/런타임 버전은 점을 사용한다("Direct3D 11.4").
Direct3D 11 수준
윈도우 10용 Direct3D 11.4에는 D3D_FEATURE_LEVEL 구조체에 의해 제공되는 9개의 기능 수준이 있다. 수준 9_1, 9_2 및 9_3(통칭 Direct3D 10 수준 9)은 인기 있는 Direct3D 9 카드의 다양한 기능을 재캡슐화하고, 수준 10_0, 10_1은 Direct3D 10의 각각의 레거시 버전을 참조하며, 11_0 및 11_1은 Direct3D 11 및 Direct3D 11.1 API와 런타임에서 도입된 기능을 반영하고, 수준 12_0 및 12_1은 Direct3D 12 API에서 도입된 새로운 기능 수준에 해당한다.
Direct3D 11.4의 기능 수준
기능 수준
필수 하드웨어 기능
선택적 기능
9_1
셰이더 모델 2.0 (vs_2_0/ps_2_0), 2K 텍스처, 볼륨 텍스처, 이벤트 쿼리, BC1-3(a.k.a. DXTn), 기타 몇 가지 특정 기능.
빈칸
9_2
오클루전 쿼리, 부동 소수점 형식 (블렌딩 없음), 확장 캡, 모든 9_1 기능.
9_3
인스턴싱 및 추가 셰이더 캡이 포함된 vs_2_a/ps_2_x, 4K 텍스처, 다중 렌더 타겟(4 MRTs), 부동 소수점 블렌딩 (제한적), 모든 9_2 기능.
10_0
셰이더 모델 4.0, 지오메트리 셰이더, 스트림 아웃, 알파-투-커버리지, 8K 텍스처, MSAA 텍스처, 양면 스텐실, 일반 렌더 타겟 뷰, 텍스처 배열, BC4/BC5, 전체 부동 소수점 형식 지원, 모든 9_3 기능.
논리 블렌드 연산, DirectCompute (CS 4.0/4.1), 확장 픽셀 형식.
10_1
셰이더 모델 4.1, 큐브맵 배열, 확장 MSAA, 모든 10_0 기능.
11_0
셰이더 모델 5.0/5.1, 헐 & 도메인 셰이더, DirectCompute (CS 5.0/5.1), 16K 텍스처, BC6H/BC7, 확장 픽셀 형식, 모든 10_1 기능.
샘플 수 강제 사용 시 UAV 전용 렌더링, 상수 버퍼 오프셋 및 부분 업데이트, 배정밀도(64비트) 부동 소수점 연산, 최소 부동 소수점 정밀도(10- 또는 16비트), 최소/최대 필터링.
11_1
논리 블렌드 연산, 타겟 독립적 래스터화, 슬롯 수가 증가된 모든 파이프라인 스테이지의 UAV, 샘플 수 강제 사용 시 UAV 전용 렌더링, 상수 버퍼 오프셋 및 부분 업데이트, 모든 11_0 기능.
타일 리소스 (네 가지 티어), 보수적 래스터화 (세 가지 티어), 픽셀 셰이더의 스텐실 참조 값, 래스터라이저 순서 뷰, 추가 형식에 대한 유형화된 UAV 로드.
12_0
타일 리소스 티어 2 (Texture2D), 유형화된 UAV 로드 (추가 형식).
12_1
보수적 래스터화 티어 1, 래스터라이저 순서 뷰.
Direct3D 12 수준
윈도우 10용 Direct3D 12는 가상 메모리 주소 변환을 지원하는 기능 수준 11_0 및 11_1을 준수하는 그래픽 하드웨어가 필요하며 WDDM 2.0 드라이버가 필요하다. 수준 11_0 및 11_1에서 선택 사항인 Direct3D 12에 의해 노출된 새로운 기능이 포함된 12_0 및 12_1이라는 두 가지 새로운 기능 수준이 있다. 이전에 선택 사항이었던 일부 기능은 수준 11_0 및 11_1에서 기준으로 재조정된다. 셰이더 모델 6.0은 윈도우 10 크리에이터스 업데이트와 함께 출시되었으며 윈도우 10 Anniversary 업데이트 및 WDDM 2.1 드라이버가 필요하다.
Direct3D 12 기능 수준
수준
필수 기능
선택적 기능
11_0
Direct3D 11의 모든 필수 11_0 기능, 셰이더 모델 5.1, 리소스 바인딩 티어 1.
논리 블렌드 연산, 배정밀도(64비트) 부동 소수점 연산, 최소 부동 소수점 정밀도(10- 또는 16비트).
리소스 바인딩 (세 가지 티어), 타일 리소스 (네 가지 티어), 보수적 래스터화 (세 가지 티어), 픽셀 셰이더의 스텐실 참조 값, 래스터라이저 순서 뷰, 추가 형식에 대한 유형화된 UAV 로드, 뷰 인스턴싱.
셰이더 모델 6.0–6.7
메타명령, 가변 셰이딩 속도, 레이트레이싱, 메시 셰이더, 샘플러 피드백.
기타 선택적 기능.
모든 파이프라인 스테이지의 UAV, 샘플 수 강제 사용 시 UAV 전용 렌더링, 상수 버퍼 오프셋 및 부분 업데이트.
11_1
논리 블렌드 연산, 타겟 독립적 래스터화, 증가된 UAV 슬롯 수.
12_0
리소스 바인딩 티어 2, 타일 리소스 티어 2 (Texture2D), 유형화된 UAV 로드 (추가 형식), 셰이더 모델 6.0.
12_1
보수적 래스터화 티어 1, 래스터라이저 순서 뷰.
12_2
DirectX 12 얼티밋: 셰이더 모델 6.5, 레이트레이싱 티어 1.1, 메시 셰이더, 가변 속도 셰이딩, 샘플러 피드백, 리소스 바인딩 티어 3, 타일 리소스 티어 3 (Texture3D), 보수적 래스터화 티어 3, 40비트 가상 주소 공간.
Direct3D 12는 메모리에 대한 명시적 제어를 허용하는 개편된 리소스 바인딩 모델을 도입한다. 추상 "리소스 뷰" 객체는 이제 메모리 힙과 테이블을 사용하여 할당되는 리소스 디스크립터로 표현된다. 리소스 바인딩 티어는 CBV(상수 버퍼 뷰), SRV(셰이더 리소스 뷰) 및 UAV(순서 없는 액세스 뷰)를 사용하여 주소를 지정할 수 있는 리소스의 최대 수와 텍스처 샘플러 단위를 정의한다. 티어 3 하드웨어는 디스크립터 힙의 크기에 의해서만 제한되는 완전히 바인드리스(bindless) 리소스를 허용하는 반면, 티어 1 및 티어 2 하드웨어는 동시에 사용할 수 있는 디스크립터("뷰") 수에 약간의 제한을 둔다.
리소스 바인딩 티어
리소스 제한
티어 1
티어 2
티어 3
CBV/SRV/UAV 힙 내 디스크립터
1M
1M
>1M
셰이더 스테이지당 CBV
14
14
전체 힙
셰이더 스테이지당 SRV
128
전체 힙
모든 스테이지에 걸친 UAV
8, 64†
64
전체 힙
셰이더 스테이지당 샘플러
16
전체 힙
† 기능 수준 11_1 하드웨어에서 64 슬롯
멀티스레딩
윈도우 비스타 이상의 WDDM 드라이버 모델은 하드웨어 또는 소프트웨어에서 임의로 많은 실행 컨텍스트 (또는 스레드)를 지원한다. 윈도우 XP는 Direct3D에 대한 멀티태스킹 액세스만 지원했으며, 별도의 애플리케이션이 서로 다른 창에서 실행되고 하드웨어 가속을 받을 수 있었지만, OS는 GPU가 수행할 수 있는 작업에 대한 제어가 제한적이었고 드라이버는 실행 스레드를 임의로 전환할 수 있었다.
런타임을 멀티스레드 모드로 실행하는 기능은 Direct3D 11 런타임과 함께 도입되었다. 각 실행 컨텍스트에는 GPU의 리소스 뷰가 제공된다. 실행 컨텍스트는 서로로부터 보호되지만, 악의적이거나 잘못 작성된 앱은 사용자 모드 드라이버에서 실행을 제어할 수 있으며 명령을 수정하여 GPU 메모리 내의 다른 프로세스에서 데이터를 잠재적으로 액세스할 수 있다. 다른 앱의 액세스로부터 보호되더라도, 잘 작성된 앱은 여전히 다른 애플리케이션으로 인해 발생하는 오류 및 장치 손실로부터 스스로를 보호해야 한다.
OS는 스레드를 스스로 관리하여 하드웨어가 적절할 때 한 스레드에서 다른 스레드로 전환할 수 있도록 하며, 통합 OS 커널 메모리 관리를 통해 메모리 관리 및 페이징 (시스템 메모리 및 디스크로)도 처리한다.
더 세밀한 컨텍스트 전환, 즉 단일 명령 레벨이나 명령 배치가 아니라 셰이더 명령어 레벨에서 두 개의 실행 스레드를 전환할 수 있는 기능은 윈도우 8과 함께 제공된 WDDM/DXGI 1.2에서 도입되었다. 이는 애플리케이션이 단일 명령/명령 배치의 실행 시간이 매우 길어 OS 감시 타이머에 의해 종료되어야 할 경우 발생할 수 있는 잠재적인 스케줄링 문제를 극복한다.
WDDM 2.0 및 DirectX 12는 완전히 멀티스레드 드로우 호출을 허용하도록 재설계되었다. 이는 모든 리소스를 불변 (즉, 읽기 전용)으로 만들고, 렌더링 상태를 직렬화하고, 드로우 호출 번들을 사용하여 달성되었다. 이를 통해 커널 모드 드라이버에서 복잡한 리소스 관리를 피하고 동일한 애플리케이션 내의 별도 렌더링 스레드에서 제공하는 동시 실행 컨텍스트를 통해 사용자 모드 드라이버로의 다중 재진입 호출이 가능해졌다.
Direct3D Mobile
Direct3D 모바일은 Direct3D에서 파생되었으나 더 작은 메모리 풋프린트를 가진다. 윈도우 CE는 Direct3D 모바일 지원을 제공한다.
대체 구현
Direct3D API의 다음과 같은 대체 구현이 존재한다. 이들은 윈도우가 아닌 플랫폼과 일부 DX 지원 버전이 없는 하드웨어에 유용하다:
DXVK – Direct3D 8/9/10/11을 위한 오픈 소스 벌컨 기반 번역 계층으로, 와인을 사용하여 리눅스에서 3D 애플리케이션을 실행할 수 있게 한다. 리눅스용 프로톤/스팀에서 사용된다. DXVK는 리눅스에서 대규모의 최신 윈도우 게임을 실행할 수 있다.
D7VK – Direct3D 3, 5, 6, 7 전용 DXVK 포크.
D8VK – 리눅스에서 Direct3D 8 지원을 추가하기 위한 폐기된 DXVK 포크. 2024년 7월 10일에 출시된 DXVK 버전 2.4와 병합되었다.
D9VK – Direct3D 9 지원을 추가하기 위한 폐기된 DXVK 포크로, 리눅스의 스팀/프로톤에 포함되어 있다. 2019년 12월 16일 D9VK는 DXVK로 병합되었다.
Gallium Nine – Gallium Nine은 Direct3D 9 애플리케이션을 리눅스에서 네이티브로 실행할 수 있게 하며, 호출 번역이 없기 때문에 거의 네이티브에 가까운 속도를 허용한다. 와인 및 메사에 의존한다.
vkd3d – vkd3d는 벌컨 위에 구축된 오픈 소스 3D 그래픽 라이브러리로, 벌컨 위에 Direct3D 12 애플리케이션을 실행할 수 있게 한다. 주로 와인 프로젝트에서 사용되며, 현재 밸브의 프로톤 프로젝트와 함께 리눅스 스팀에 포함되어 있다.
와인D3D – 와인 오픈 소스 프로젝트는 OpenGL로 번역을 통해 Direct3D API를 구현하고 있다. 와인의 구현은 특정 조건 하에서 윈도우에서도 실행될 수 있다.
Direct3D는 유클리드 벡터, 행렬 및 색상에 대한 공통 수학 계산을 수행하고, look-at 및 사영 행렬, 스플라인 보간법을 계산하며, 3D 그래픽 프로그래밍에 사용되는 셰이더 컴파일 또는 어셈블, 압축된 골격 애니메이션 저장 및 행렬 스택과 같은 더 복잡한 작업을 수행하도록 설계된 도구 라이브러리인 D3DX와 함께 제공된다. 탄젠트 공간 계산, 메시 단순화, 미리 계산된 복사 전송, 정점 캐시 최적화 및 스트립화, 3D 텍스트 메시 생성기와 같은 3D 메시에 대해 복잡한 작업을 제공하는 함수가 많이 있다. 2D 기능으로는 화면 공간 선, 텍스트 및 스프라이트 기반 입자 시스템을 그리기 위한 클래스가 포함된다. 공간 기능에는 다양한 교차 루틴, 바리센트릭 좌표 간의 변환 및 바운딩 박스/구 생성기가 포함된다. D3DX는 DLL로 제공된다. D3DX는 윈도우 8부터는 더 이상 사용되지 않으며 Windows 스토어 앱에서는 사용할 수 없다.
이전 버전의 D3DX에 있던 일부 기능은 Direct3D 11에서 제거되었으며 이제 별도의 소스로 제공된다:
윈도우 SDK 및 비주얼 스튜디오
수학 라이브러리의 많은 부분이 제거되었다. 마이크로소프트는 대신 DirectX 수학 라이브러리 사용을 권장한다.
구면 조화(Spherical harmonics) 수학이 제거되었으며 이제 소스로 배포된다.
효과 프레임워크가 제거되었으며 이제 CodePlex를 통해 소스로 배포된다.
메시 인터페이스와 지오메트리 기능이 제거되었으며 이제 DirectXMesh 지오메트리 처리 라이브러리 아래 CodePlex를 통해 소스로 배포된다.
텍스처 기능이 제거되었으며 이제 DirectXTex 텍스처 처리 라이브러리 아래 CodePlex를 통해 소스로 배포된다.
일반 헬퍼가 제거되었으며 이제 DirectX 툴 킷(DirectXTK) 프로젝트 아래 CodePlex를 통해 소스로 배포된다.
아이소차트(isochart) 텍스처 아틀라스가 제거되었으며 이제 UVAtlas 프로젝트 아래 CodePlex를 통해 소스로 배포된다.
DXUT
DXUT(샘플 프레임워크라고도 함)는 Direct3D API 위에 구축된 계층이다. 이 프레임워크는 프로그래머가 창 생성, 장치 생성, 윈도우 메시지 처리 및 장치 이벤트 처리와 같은 평범한 작업에 시간을 덜 소비하도록 돕기 위해 설계되었다. DXUT는 윈도우 SDK 8.0에서 제거되었으며 이제 CodePlex를 통해 소스로 배포된다.
↑Smith, Ryan (2014년 9월 18일). “The NVIDIA GeForce GTX 980 Review: Maxwell Mark 2”. 《AnandTech》. 2014년 9월 22일에 원본 문서에서 보존된 문서. 2014년 9월 30일에 확인함. First and foremost among Maxwell 2's new features is the inclusion of full Direct3D 11.2/11.3 compatibility.