# Direct3D

Direct3D és una interfície de programació d'aplicacions gràfiques (API) per a Microsoft Windows. Part de DirectX, Direct3D s'utilitza per representar gràfics tridimensionals en aplicacions on el rendiment és important, com ara els jocs. Direct3D utilitza l'acceleració de maquinari si està disponible a la targeta gràfica, permetent l'acceleració de maquinari de tot el canal de representació 3D o fins i tot només una acceleració parcial. Direct3D exposa les capacitats de gràfics avançats del maquinari de gràfics 3D, com ara Z-buffering, W-buffering, stencil buffering, anti-aliasing espacial, alpha blending, color
blending, mipmapping, texture blending,] retall, culling, efectes atmosfèrics, mapes de textures de perspectiva correcta, shaders HLSL programables i efectes. La integració amb altres tecnologies DirectX permet que Direct3D ofereixi funcions com ara mapeig de vídeo, renderització 3D de maquinari en plans de superposició 2D i fins i tot sprites, proporcionant l'ús de gràfics 2D i 3D en enllaços multimèdia interactius.
Direct3D conté moltes ordres per a la representació de gràfics per ordinador en 3D; tanmateix, des de la versió 8, Direct3D ha substituït el marc de DirectDraw i també s'ha responsabilitzat de la representació de gràfics en 2D. Microsoft s'esforça per actualitzar contínuament Direct3D per donar suport a l'última tecnologia disponible a les targetes gràfiques 3D. Direct3D ofereix emulació de programari de vèrtex completa, però no emulació de programari de píxels per a funcions que no estan disponibles al maquinari. Per exemple, si el programari programat amb Direct3D requereix sombreadors de píxels i la targeta de vídeo de l'ordinador de l'usuari no admet aquesta funció, Direct3D no l'emularà, tot i que calcularà i representarà els polígons i textures dels models 3D, encara que normalment qualitat i rendiment degradats en comparació amb l'equivalent de maquinari. L'API inclou un Rasteritzador de referència (o dispositiu REF), que emula una targeta gràfica genèrica al programari, tot i que és massa lenta per a la majoria d'aplicacions 3D en temps real i normalment només s'utilitza per a la depuració. Un nou rasteritzador de programari en temps real, WARP, dissenyat per emular el conjunt complet de funcions de Direct3D 10.1, s'inclou amb Windows 7 i Windows Vista Service Pack 2 amb l'actualització de la plataforma; Es diu que el seu rendiment és a l'igual de les targetes 3D de gamma baixa en CPU multinucli.
Com a part de DirectX, Direct3D està disponible per a Windows 95 i posteriors, i és la base per a l'API de gràfics vectorials a les diferents versions dels sistemes de consola Xbox. La capa de compatibilitat Wine, una reimplementació de programari lliure de diverses API de Windows, inclou una implementació de Direct3D.
El principal competidor de Direct3D és l'OpenGL de Khronos i el següent Vulkan. Fahrenheit va ser un intent de Microsoft i SGI d'unificar OpenGL i Direct3D a la dècada de 1990, però finalment es va cancel·lar.

## Visió general

* Direct3D 6.0 – Multitexturització
* Direct3D 7.0: transformació de maquinari, retall i il·luminació (TCL/T&L)
* Direct3D 8.0: Pixel Shader 1.0/1.1 i Vertex Shader 1.0/1.1
* Direct3D 8.1: Pixel Shader 1.2/1.3/1.4
* Direct3D 9.0: Shader Model 2.0 (Pixel Shader 2.0 i Vertex Shader 2.0)
* Direct3D 9.0a: Shader Model 2.0a (Pixel Shader 2.0a i Vertex Shader 2.0a)
* Direct3D 9.0b: Pixel Shader 2.0b
* Direct3D 9.0c: darrera versió compatible amb Windows 98 (primeres versions) i per a Windows 2000 / XP (totes les versions); Shader Model 3.0 (Pixel Shader 3.0 i Vertex Shader 3.0)
* Direct3D 9.0L: només Windows Vista ; Direct3D 9.0c, Shader Model 3.0, Windows Graphics Foundation 1.0, DXVA 1.0, GPGPU
* Direct3D 10.0 - Windows Vista/Windows 7; Shader Model 4.0, Windows Graphics Foundation 2.0, DXVA 2.0
* Direct3D 10.1 - Windows Vista SP1/Windows 7; Shader Model 4.1, Windows Graphics Foundation 2.1, DXVA 2.1
* Direct3D 11.0 - Windows Vista SP2/ Windows 7 ; Shader Model 5.0, Tessellation, Multithreaded rendering, Compute shaders, implementat per maquinari i programari amb Direct3D 9/10/10.1
* Direct3D 11.1 - Windows 8 (també compatible amb Windows 7 SP1 parcialment); Renderització 3D estereoscòpica
* Direct3D 11.2 - Windows 8.1; Recursos enrajolats
* Direct3D 11.3 - Windows 10
* Direct3D 12.0 - Windows 10; API de renderització de baix nivell, Shader Model 5.1 i 6.0

## Arquitectura

Direct3D és un component del subsistema de l'API de Microsoft DirectX. L'objectiu de Direct3D és abstraure la comunicació entre una aplicació gràfica i els controladors de maquinari gràfic. Es presenta com una fina capa abstracta a un nivell comparable al GDI (vegeu el diagrama adjunt). Direct3D conté nombroses funcions que no tenen a GDI.
Direct3D és una API de gràfics en mode immediat . Proporciona una interfície de baix nivell per a totes les funcions 3D de la targeta de vídeo (transformacions, retalls, il·luminació, materials, textures, buffer de profunditat, etc.). Abans tenia un component de mode retingut de nivell superior, ara oficialment interromput.
El mode immediat Direct3D presenta tres abstraccions principals: dispositius, recursos i cadenes d'intercanvi (vegeu el diagrama adjunt). Els dispositius són els responsables de representar l'escena 3D. Proporcionen una interfície amb diferents capacitats de renderització. Per exemple, el dispositiu mono proporciona una representació en blanc i negre, mentre que el dispositiu RGB es renderitza en color. Hi ha quatre tipus de dispositius:
* Dispositiu HAL (capa d'abstracció de maquinari): per a dispositius que admeten l'acceleració de maquinari.
* Dispositiu de referència: simula noves funcions que encara no estan disponibles al maquinari. Cal instal·lar l'SDK Direct3D per utilitzar aquest tipus de dispositiu.
* Dispositiu de referència nul: no fa res. Aquest dispositiu s'utilitza quan l'SDK no està instal·lat i es demana un dispositiu de referència.Procés de canalització de gràfics Direct3D 11
* Dispositiu de programari connectable: realitza la representació de programari. Aquest dispositiu es va presentar amb DirectX 9.0.
Cada dispositiu conté almenys una cadena d'intercanvi . Una cadena d'intercanvi està formada per una o més superfícies d'amortiment posterior. La representació es produeix a la memòria intermèdia posterior.

## Canalització

L'API de Microsoft Direct3D 11 defineix un procés per convertir un grup de vèrtexs, textures, buffers i estat en una imatge a la pantalla. Aquest procés es descriu com un pipeline de renderització amb diverses etapes diferents. Les diferents etapes del pipeline Direct3D 11 són:
* Input-Assembler : Llegeix dades de vèrtex d'una memòria intermèdia de vèrtex subministrada per l'aplicació i les alimenta per la canalització.
* Vertex Shader : Realitza operacions sobre un sol vèrtex alhora, com ara transformacions, desollament o il·luminació.
* Hull-Shader : Realitza operacions sobre conjunts de punts de control de pedaços i genera dades addicionals conegudes com a constants de pegat.
* Tessel·lador : Subdivideix la geometria per crear representacions d'ordre superior del casc.
* Domain-Shader : Realitza operacions sobre vèrtexs sortits per l'etapa de tessel·lació, de la mateixa manera que un vertex shader.
* Geometry Shader : Processa primitives senceres com ara triangles, punts o línies. Donat un primitiu, aquest estadi el descarta, o genera un o més primitius nous.
* Stream-Output : Pot escriure els resultats de l'etapa anterior a la memòria. Això és útil per recircular les dades al pipeline.
* Rasteritzador : Converteix els primitius en píxels, alimentant aquests píxels al sombreador de píxels. El Rasteritzador també pot realitzar altres tasques, com ara retallar allò que no és visible o interpolar dades de vèrtex en dades per píxel.
* Pixel Shader : determina el color de píxel final que s'ha d'escriure a l'objectiu de renderització i també pot calcular un valor de profunditat que s'ha d'escriure a la memòria intermèdia de profunditat.
* Output-Merger : Combina diversos tipus de dades de sortida (valors de sombreador de píxels, barreja alfa, profunditat/plantilla...) per crear el resultat final.

## Referències

* ↑ «Configuring Depth-Stencil Functionality» (en anglès). Microsoft.
* ↑ «RenderStateManager.UseWBuffer» (en anglès). Microsoft.
* ↑ «Texture Blending (Direct3D 9)» (en anglès). Microsoft.
* 1 2 «Geometry Blending (Direct3D 9)» (en anglès). Microsoft.
* ↑ «HLSL» (en anglès). Microsoft.
* ↑ «Effects (Direct3D 11)» (en anglès). Microsoft.
* ↑ «DirectX Software Development Kit, October 2006» (en anglès). Microsoft. Arxivat de l'original el 2011-11-02.
* ↑ «Windows Advanced Rasterization Platform (WARP) Guide – WARP Architecture and Performance» (en anglès). MSDN.
* ↑ «Graphics Pipeline» (en anglès). Microsoft Docs. [Consulta: 19 octubre 2021].
* ↑ «Input-Assembler Stage» (en anglès). Microsoft Docs. [Consulta: 19 octubre 2021].
* ↑ «Vertex Shader Stage». Microsoft Docs. [Consulta: 19 octubre 2021].
* 1 2 3 «Tessellation Stages» (en anglès). Microsoft Docs. [Consulta: 19 octubre 2021].
* ↑ «Geometry Shader Stage» (en anglès). Microsoft Docs. [Consulta: 19 octubre 2021].
* ↑ «Stream-Output Stage» (en anglès). Microsoft Docs. [Consulta: 19 octubre 2021].
* ↑ «RenderStates» (en anglès). Microsoft Docs. [Consulta: 19 octubre 2021].
* ↑ «Rasterizer Stage» (en anglès). Microsoft Docs. [Consulta: 19 octubre 2021].
* ↑ «Pixel Shader Stage» (en anglès). Microsoft Docs. [Consulta: 19 octubre 2021].
* ↑ «Output-Merger Stage» (en anglès). Microsoft Docs. [Consulta: 19 octubre 2021].