Direct3D es una interfaz de programación de aplicaciones gráficas (API) para Microsoft Windows . Parte de DirectX , Direct3D se utiliza para renderizar gráficos tridimensionales en aplicaciones donde el rendimiento es importante, como los juegos. Direct3D utiliza aceleración de hardware si está disponible en la tarjeta gráfica , lo que permite la aceleración de hardware de todo el proceso de renderizado 3D o incluso solo una aceleración parcial. Direct3D expone las capacidades gráficas avanzadas del hardware de gráficos 3D, incluido el almacenamiento en búfer Z , [1] el almacenamiento en búfer W, [2] el almacenamiento en búfer de esténcil , el suavizado espacial , la combinación alfa , la combinación de colores, el mapeo mip , la combinación de texturas, [3] [4] el recorte , la selección , los efectos atmosféricos, el mapeo de texturas con perspectiva correcta , los sombreadores HLSL programables [5] y los efectos. [6] La integración con otras tecnologías DirectX permite a Direct3D ofrecer características tales como mapeo de video, renderizado 3D de hardware en planos superpuestos 2D e incluso sprites , facilitando el uso de gráficos 2D y 3D en vínculos multimedia interactivos.
Direct3D contiene muchos comandos para la representación de gráficos 3D por ordenador ; sin embargo, desde la versión 8, Direct3D ha sustituido al marco DirectDraw y también ha asumido la responsabilidad de la representación de gráficos 2D . [7] Microsoft se esfuerza por actualizar continuamente Direct3D para que admita la última tecnología disponible en tarjetas gráficas 3D. Direct3D ofrece emulación de software de vértices completa , pero no emulación de software de píxeles para funciones que no están disponibles en el hardware. Por ejemplo, si el software programado con Direct3D requiere sombreadores de píxeles y la tarjeta de vídeo de la computadora del usuario no admite esa función, Direct3D no la emulará, aunque calculará y renderizará los polígonos y las texturas de los modelos 3D, aunque con una calidad y un rendimiento generalmente degradados en comparación con el equivalente de hardware. La API incluye un rasterizador de referencia (o dispositivo REF), que emula una tarjeta gráfica genérica en el software, aunque es demasiado lento para la mayoría de las aplicaciones 3D en tiempo real y normalmente solo se utiliza para depuración. Un nuevo rasterizador de software en tiempo real, WARP , diseñado para emular el conjunto completo de características de Direct3D 10.1, se incluye con Windows 7 y Windows Vista Service Pack 2 con la Actualización de plataforma; se dice que su rendimiento está a la par con las tarjetas 3D de gama baja en CPU de múltiples núcleos. [8]
Como parte de DirectX , Direct3D está disponible para Windows 95 y posteriores, y es la base de la API de gráficos vectoriales en las diferentes versiones de los sistemas de consola Xbox . La capa de compatibilidad Wine , una reimplementación de software libre de varias API de Windows, incluye una implementación de Direct3D.
El principal competidor de Direct3D es OpenGL de Khronos y su sucesor Vulkan . Fahrenheit fue un intento de Microsoft y SGI de unificar OpenGL y Direct3D en los años 90, pero finalmente fue cancelado.
En 1992, Servan Keondjian, Doug Rabson y Kate Seekings fundaron una empresa llamada RenderMorphics, que desarrolló una API de gráficos 3D llamada Reality Lab , que se utilizó en software de CAD y de imágenes médicas. [15] Se lanzaron dos versiones de esta API. [16] Microsoft compró RenderMorphics en febrero de 1995, y contrató a su personal para implementar un motor de gráficos 3D para Windows 95. [ 17] La primera versión de Direct3D se envió en DirectX 2.0 (2 de junio de 1996) y DirectX 3.0 (26 de septiembre de 1996).
Direct3D inicialmente implementó una API 3D de " modo inmediato " y le aplicó una API 3D de " modo retenido ". [18] Ambos tipos de API ya se ofrecían con la segunda versión de Reality Lab antes del lanzamiento de Direct3D. [16] Al igual que otras API de DirectX, como DirectDraw , ambas se basaban en COM . La API de modo retenido era una API de gráficos de escena que logró poca adopción. Los desarrolladores de juegos clamaban por un control más directo de las actividades del hardware que el que podía proporcionar el modo retenido de Direct3D. Solo dos juegos que se vendieron en un volumen significativo, Lego Island y Lego Rock Raiders , se basaron en el modo retenido de Direct3D, por lo que Microsoft no actualizó la API de modo retenido después de DirectX 3.0.
Para DirectX 2.0 y 3.0, el modo inmediato de Direct3D utilizaba un modelo de programación de "búfer de ejecución" que Microsoft esperaba que los proveedores de hardware admitieran directamente. Los búferes de ejecución estaban pensados para ser asignados en la memoria del hardware y analizados por el hardware para realizar la renderización 3D. Sin embargo, en ese momento se consideraban extremadamente difíciles de programar, lo que dificultó la adopción de la nueva API y provocó peticiones para que Microsoft adoptara OpenGL como la API de renderización 3D oficial para juegos y aplicaciones de estaciones de trabajo. [19] (véase OpenGL vs. Direct3D)
En lugar de adoptar OpenGL como una API de juegos, Microsoft decidió seguir mejorando Direct3D, no sólo para competir con OpenGL, sino para competir más eficazmente con otras API propietarias como Glide de 3dfx .
Desde el principio, el modo inmediato también admitió la representación en mosaico de Talisman con los métodos BeginScene/EndScene de la interfaz IDirect3DDevice.
No se planearon cambios sustanciales en Direct3D para DirectX 4.0 , cuyo lanzamiento estaba previsto para finales de 1996 y luego se canceló. [20]
En diciembre de 1996, un equipo de Redmond se hizo cargo del desarrollo del modo inmediato de Direct3D, mientras que el equipo de RenderMorphics, con sede en Londres, continuó trabajando en el modo retenido. El equipo de Redmond agregó la API DrawPrimitive que eliminó la necesidad de que las aplicaciones construyeran búferes de ejecución, lo que hizo que Direct3D se pareciera más a otras API de renderizado en modo inmediato, como Glide y OpenGL . La primera versión beta de DrawPrimitive se envió en febrero de 1997, [21] y la versión final se envió con DirectX 5.0 en agosto de 1997. [22]
Además de introducir una API de modo inmediato más fácil de usar, DirectX 5.0 agregó el método SetRenderTarget que permitió a los dispositivos Direct3D escribir su salida gráfica en una variedad de superficies DirectDraw. [23]
DirectX 6.0 (lanzado en agosto de 1998) introdujo numerosas características para cubrir el hardware contemporáneo (como multitextura [24] y buffers de esténcil ) así como también tuberías de geometría optimizadas para x87 , SSE y 3DNow! y administración de texturas opcional para simplificar la programación. [25] Direct3D 6.0 también incluyó soporte para características que habían sido licenciadas por Microsoft de proveedores de hardware específicos para su inclusión en la API, a cambio de la ventaja de tiempo de comercialización para el proveedor de la licencia. El soporte de compresión de textura S3 fue una de esas características, renombrada como DXTC para fines de inclusión en la API. Otra fue la técnica de mapeo de relieve patentada de TriTech . Microsoft incluyó estas características en DirectX, luego las agregó a los requisitos necesarios para que los controladores obtengan un logotipo de Windows para alentar la adopción amplia de las características en el hardware de otros proveedores.
En febrero de 1999, se realizó una actualización menor de DirectX 6.0 con la actualización de DirectX 6.1. Además de agregar compatibilidad con DirectMusic por primera vez, esta versión mejoró la compatibilidad con las extensiones 3D de Intel Pentium III . [26]
Un memorando confidencial enviado en 1997 [27] muestra que Microsoft planeaba anunciar soporte completo para Talisman en DirectX 6.0, pero la API terminó siendo cancelada (consulte la página de Microsoft Talisman para obtener más detalles).
DirectX 7.0 (lanzado en septiembre de 1999) introdujo el formato de textura .dds [28] y soporte para aceleración de hardware de iluminación y transformación [29] (disponible por primera vez en hardware de PC con GeForce 256 de Nvidia ), así como la capacidad de asignar buffers de vértices en la memoria de hardware. Los buffers de vértices de hardware representan la primera mejora sustancial sobre OpenGL en la historia de DirectX. Direct3D 7.0 también aumentó el soporte de DirectX para hardware de multitextura y representa el pináculo de las características de canalización de multitextura de función fija: aunque potente, era tan complicado de programar que se necesitaba un nuevo modelo de programación para exponer las capacidades de sombreado del hardware de gráficos. Direct3D 7.0 también introdujo características DXVA .
DirectX 8.0 (lanzado en noviembre de 2000) introdujo la programabilidad en forma de sombreadores de vértices y píxeles , lo que permitió a los desarrolladores escribir código sin preocuparse por el estado superfluo del hardware. [30] La complejidad de los programas de sombreado dependía de la complejidad de la tarea, y el controlador de pantalla compilaba esos sombreadores en instrucciones que el hardware podía entender. Direct3D 8.0 y sus capacidades de sombreado programable fueron la primera desviación importante de una arquitectura de función fija al estilo OpenGL, donde el dibujo está controlado por una máquina de estados complicada. Direct3D 8.0 también eliminó DirectDraw como una API separada. [31] [32] Direct3D absorbió todas las llamadas a la API de DirectDraw restantes que aún eran necesarias para el desarrollo de aplicaciones, como Present(), la función utilizada para mostrar los resultados de renderizado.
Direct3D no se consideraba fácil de usar, pero a partir de la versión 8.1 de DirectX se resolvieron muchos problemas de usabilidad. Direct3D 8 contenía muchas funciones de gráficos 3D potentes, como sombreadores de vértices , sombreadores de píxeles , niebla , mapeo de relieve y mapeo de texturas .
Direct3D 9.0 [33] (lanzado en diciembre de 2002) agregó una nueva versión del lenguaje de sombreado de alto nivel [34] [35], compatibilidad con formatos de textura de punto flotante, objetivos de renderizado múltiples (MRT), [36] texturas de múltiples elementos, [37] búsquedas de textura en el sombreador de vértices y técnicas de búfer de esténcil. [38]
Direct3D 9Ex [39] (anteriormente versión 9.0L ("L" significa Longhorn, el nombre en código para Windows Vista)), una extensión solo disponible en Windows Vista, 7, 8, 8.1, 10 y 11, permite el uso de las ventajas ofrecidas por el Modelo de controlador de pantalla de Windows (WDDM) de Windows Vista y se utiliza para Windows Aero . [40] Direct3D 9Ex, junto con los controladores WDDM de clase DirectX 9, permite virtualizar la memoria gráfica y paginarla en la memoria del sistema, permite interrumpir y programar operaciones gráficas y permite compartir superficies DirectX entre procesos. [41] Direct3D 9Ex se conocía anteriormente como la versión 1.0 de Windows Graphics Foundation (WGF).
Mejoras de Direct3D 9Ex: aplicaciones Win32
Windows Vista incluye una importante actualización de la API Direct3D. Originalmente llamada WGF 2.0 (Windows Graphics Foundation 2.0), luego DirectX 10 y DirectX Next, Direct3D 10 [42] presenta un modelo de sombreado actualizado 4.0 y capacidad de interrupción opcional para programas de sombreado. [41] En este modelo, los sombreadores aún consisten en etapas fijas como en versiones anteriores, pero todas las etapas admiten una interfaz casi unificada, así como un paradigma de acceso unificado para recursos como texturas y constantes de sombreador. El lenguaje en sí se ha ampliado para que sea más expresivo, incluyendo operaciones con números enteros, un conteo de instrucciones mucho mayor y más construcciones de lenguaje similares a C. Además de las etapas de sombreado de vértices y píxeles disponibles anteriormente , la API incluye una etapa de sombreado de geometría que rompe el antiguo modelo de un vértice de entrada/un vértice de salida, para permitir que la geometría se genere desde dentro de un sombreador, lo que permite que la geometría compleja se genere completamente por el hardware de gráficos.
DirectX 10.0 y versiones posteriores no son compatibles con Windows XP y versiones anteriores. Además, Direct3D 10 dejó de ofrecer compatibilidad con la API de modo retenido que había sido parte de Direct3D desde el principio, lo que hizo que Windows Vista fuera incompatible con los juegos 3D que habían utilizado la API de modo retenido como motor de renderizado . [43]
A diferencia de las versiones anteriores de la API, Direct3D 10 ya no utiliza "bits de capacidad" (o "límites") para indicar qué características son compatibles con un dispositivo gráfico determinado. En su lugar, define un estándar mínimo de capacidades de hardware que deben ser compatibles para que un sistema de visualización sea "compatible con Direct3D 10". Se trata de un cambio significativo, con el objetivo de agilizar el código de aplicación eliminando el código de comprobación de capacidad y los casos especiales basados en la presencia o ausencia de capacidades específicas.
Debido a que el hardware Direct3D 10 era comparativamente raro después del lanzamiento inicial de Windows Vista y debido a la base de instalación masiva de tarjetas gráficas no compatibles con Direct3D 10, los primeros juegos compatibles con Direct3D 10 aún proporcionan rutas de renderizado de Direct3D 9. Ejemplos de tales títulos son juegos originalmente escritos para Direct3D 9 y portados a Direct3D 10 después de su lanzamiento, como Company of Heroes , o juegos desarrollados originalmente para Direct3D 9 con una ruta de renderizado de Direct3D 10 adaptada posteriormente durante su desarrollo, como Hellgate: London o Crysis . El SDK de DirectX 10 estuvo disponible en febrero de 2007. [44]
El hardware de nivel Direct3D 10.0 debe soportar las siguientes características: la capacidad de procesar primitivos enteros en la nueva etapa de sombreado de geometría, la capacidad de generar datos de vértices generados por la canalización en la memoria mediante la etapa de salida de flujo, soporte de alfa a cobertura de muestreo múltiple, lectura de una superficie de profundidad/plantilla o un recurso de muestreo múltiple una vez que ya no está vinculado como un objetivo de renderizado, integración completa con HLSL (todos los sombreadores Direct3D 10 están escritos en HLSL e implementados con el núcleo de sombreador común), operaciones de sombreado de enteros y bits, organización del estado de la canalización en 5 objetos de estado inmutables, organización de constantes de sombreador en búferes constantes, mayor número de objetivos de renderizado, texturas y muestreadores, sin límite de longitud de sombreador, nuevos tipos de recursos y formatos de recursos, [45] capas de API/tiempo de ejecución en capas, [46] opción para realizar intercambio y configuración de material por primitivo mediante un sombreador de geometría, mayor generalización del acceso a recursos mediante una vista, eliminación de bits de capacidad de hardware heredado (caps).
Direct3D 10.1 [52] fue anunciado por Microsoft poco después del lanzamiento de Direct3D 10 como una actualización menor. La especificación se finalizó con el lanzamiento del SDK de DirectX en noviembre de 2007 y el entorno de ejecución se envió con Windows Vista SP1 , que está disponible desde mediados de marzo de 2008.
Direct3D 10.1 establece algunos estándares más de calidad de imagen para los proveedores de gráficos y brinda a los desarrolladores más control sobre la calidad de la imagen. [53] [54] Las características incluyen un control más preciso sobre el anti-aliasing (tanto multimuestreo como supermuestreo con sombreado por muestra y control de la aplicación sobre la posición de la muestra) y más flexibilidades para algunas de las características existentes (matrices de mapas cúbicos y modos de fusión independientes). El hardware de nivel Direct3D 10.1 debe admitir las siguientes características: El multimuestreo se ha mejorado para generalizar la transparencia basada en la cobertura y hacer que el multimuestreo funcione de manera más efectiva con renderizado de múltiples pasadas, mejor comportamiento de selección: las caras de área cero se seleccionan automáticamente; Esto afecta solo a la representación de wireframe, modos de fusión independientes por objetivo de representación, nueva ejecución de sombreador de píxeles de frecuencia de muestreo con rasterización primitiva, mayor ancho de banda de la etapa de canalización, ahora se pueden usar superficies MSAA de color y profundidad/plantilla con CopyResource como origen o destino, MultisampleEnable solo afecta a la rasterización de línea (los puntos y triángulos no se ven afectados) y se usa para elegir un algoritmo de dibujo de línea. Esto significa que ya no se admite cierta rasterización multimuestra de Direct3D 10, Muestreo de textura: las instrucciones sample_c y sample_c_lz están definidas para funcionar con Texture2DArrays y TextureCubeArrays, usan el miembro Location (el componente alfa) para especificar un índice de matriz, compatibilidad con TextureCubeArrays.
A diferencia de Direct3D 10, que requería estrictamente interfaces de hardware y controladores de clase Direct3D 10, el entorno de ejecución de Direct3D 10.1 puede ejecutarse en hardware Direct3D 10.0 utilizando un concepto de "niveles de características", [56] [57] [58] pero las nuevas características son soportadas exclusivamente por nuevo hardware que expone el nivel de característica 10_1.
El único hardware Direct3D 10.1 disponible en junio de 2008 eran las series Radeon HD 3000 y Radeon HD 4000 de ATI ; en 2009, se les unieron las GPU Chrome 430/440GT de S3 Graphics y algunos modelos de gama baja de la serie GeForce 200 de Nvidia . En 2011, los chipsets de Intel comenzaron a soportar Direct3D 10.1 con la introducción de Intel HD Graphics 2000 (GMA HD).
Direct3D 11 [59] fue lanzado como parte de Windows 7. Fue presentado en Gamefest 2008 el 22 de julio de 2008 y demostrado en la conferencia técnica Nvision 08 el 26 de agosto de 2008. [60] [61] La vista previa técnica de Direct3D 11 se incluyó en la versión de noviembre de 2008 del SDK de DirectX. [62] AMD presentó una vista previa del hardware DirectX11 funcional en Computex el 3 de junio de 2009, ejecutando algunas muestras del SDK de DirectX 11. [63]
El entorno de ejecución de Direct3D 11 puede ejecutarse en hardware y controladores de clase Direct3D 9 y 10.x utilizando el concepto de "niveles de características", ampliando la funcionalidad introducida por primera vez en el entorno de ejecución de Direct3D 10.1. [56] [64] [65] Los niveles de características permiten a los desarrolladores unificar el flujo de procesamiento de renderizado bajo la API de Direct3D 11 y hacer uso de las mejoras de la API, como una mejor gestión de recursos y multiprocesamiento incluso en tarjetas de nivel de entrada, aunque las características avanzadas, como nuevos modelos de sombreado y etapas de renderizado, solo se expondrán en hardware de nivel superior. [64] [66] Hay tres perfiles "10 Nivel 9" que encapsulan varias capacidades de las populares tarjetas DirectX 9.0a, y Direct3D 10, 10.1 y 11 tienen cada uno un nivel de característica separado; cada nivel superior es un superconjunto estricto de un nivel inferior. [67]
La teselación se consideró anteriormente para Direct3D 10, pero luego se abandonó. Las GPU como Radeon R600 cuentan con un motor de teselación que se puede usar con Direct3D 9/10/10.1 [68] [69] [70] y OpenGL, [71] pero no es compatible con Direct3D 11 (según Microsoft). El hardware gráfico más antiguo, como Radeon 8xxx, GeForce 3/4, tenía soporte para otra forma de teselación (parches RT, parches N), pero esas tecnologías nunca se usaron de manera sustancial. Por lo tanto, su soporte se eliminó del hardware más nuevo.
Microsoft también ha insinuado otras características como la transparencia independiente del orden , que nunca fue expuesta por la API de Direct3D pero que era soportada casi de manera transparente por el hardware Direct3D temprano como la línea de chips PowerVR de Videologic .
Las características de Direct3D 11.0 incluyen: Soporte para Shader Model 5.0, enlace dinámico de shader, recursos direccionables, tipos de recursos adicionales, [72] subrutinas, instanciación de geometría, cobertura como entrada de shader de píxeles, interpolación programable de entradas, nuevos formatos de compresión de textura (1 nuevo formato LDR y 1 nuevo formato HDR), fijaciones de textura para limitar la precarga de WDDM, requiere 8 bits de precisión de subtexel y sub-mip en el filtrado de textura, límites de textura de 16K, Gather4 (soporte para texturas de múltiples componentes, soporte para desplazamientos programables), DrawIndirect, oDepth conservador, Depth Bias, [73] [74] salida de flujo direccionable, fijación de mipmap por recurso, ventanas gráficas de punto flotante, instrucciones de conversión de shader, multihilo mejorado.
Otras características notables son la adición de dos nuevos algoritmos de compresión de texturas para un empaquetado más eficiente de texturas de alta calidad y HDR/alfa y un caché de texturas aumentado .
Visto por primera vez en la versión Release Candidate , Windows 7 integra el primer soporte para Direct3D 11 lanzado. La actualización de plataforma para Windows Vista incluye el entorno de ejecución de Direct3D 11 con todas las funciones y la actualización de DXGI 1.1, así como otros componentes relacionados de Windows 7 como WARP , Direct2D , DirectWrite y WIC . [78] [79]
Direct3D 11.1 [80] [81] es una actualización de la API que se incluye con Windows 8. [ 82] [83] El entorno de ejecución de Direct3D en Windows 8 incluye DXGI 1.2 [84] y requiere nuevos controladores de dispositivos WDDM 1.2 [85] . [86] La versión preliminar del SDK de Windows para Windows 8 Developer Preview se lanzó el 13 de septiembre de 2011.
Las nuevas características de API incluyen trazado de sombreadores y mejoras del compilador HLSL, compatibilidad con tipos de datos escalares HLSL de precisión mínima, [87] UAV (vistas de acceso no ordenado) en cada etapa de la canalización, rasterización independiente del objetivo (TIR), opción para mapear SRV de búferes dinámicos con NO_OVERWRITE, procesamiento de sombreadores de recursos de video, opción para usar operaciones lógicas en un objetivo de renderizado, opción para vincular un subrango de un búfer constante a un sombreador y recuperarlo, opción para crear búferes constantes más grandes de los que un sombreador puede acceder, opción para descartar recursos y vistas de recursos, opción para cambiar subrecursos con nuevas opciones de copia, opción para forzar el recuento de muestras para crear un estado de rasterizador, opción para borrar todo o parte de una vista de recursos, opción para usar Direct3D en procesos de Sesión 0, opción para especificar planos de recorte de usuario en HLSL en el nivel de característica 9 y superior, compatibilidad con búfer de sombra en el nivel de característica 9, compatibilidad con reproducción de video, compatibilidad extendida para recursos Texture2D compartidos e intercambio sobre la marcha entre Direct3D 10 y 11 contextos y niveles de características. Direct3D 11.1 incluye el nuevo nivel de característica 11_1, que aporta actualizaciones menores al lenguaje de sombreado, como búferes constantes más grandes e instrucciones de doble precisión opcionales, así como modos de fusión mejorados y soporte obligatorio para formatos de color de 16 bits para mejorar el rendimiento de GPU de nivel de entrada como Intel HD Graphics . [86] [88] WARP se ha actualizado para admitir el nivel de característica 11_1.
La actualización de plataforma para Windows 7 incluye un conjunto limitado de características de Direct3D 11.1, aunque los componentes que dependen de WDDM 1.2 (como el nivel de característica 11_1 y sus API relacionadas, o el almacenamiento en búfer cuádruple para renderizado estereoscópico ) no están presentes. [89] [90]
Direct3D 11.2 [91] [92] [93] se envió con Windows 8.1 . [94] [95] Las nuevas características de hardware requieren DXGI 1.3 [96] con controladores WDDM 1.3 [97] e incluyen modificación y enlace de sombreadores en tiempo de ejecución, gráfico de enlace de funciones (FLG), compilador HLSL de bandeja de entrada , opción para anotar comandos gráficos. [98] Los niveles de características 11_0 y 11_1 introducen soporte opcional para recursos en mosaico con fijación de nivel de detalle de sombreador (Tier2). [99] La última característica proporciona control de manera efectiva sobre las tablas de páginas de hardware presentes en muchas GPU actuales. [100] WARP se actualizó para soportar completamente las nuevas características. [94] [101] Sin embargo, no existe un nivel de característica 11_2; las nuevas características están dispersas en los niveles de características existentes. Aquellas que dependen del hardware se pueden verificar individualmente a través de CheckFeatureSupport
. [95] [102] Algunas de las "nuevas" características de Direct3D 11.2 en realidad exponen algunas características de hardware antiguas de una manera más granular; por ejemplo, D3D11_FEATURE_D3D9_SIMPLE_INSTANCING_SUPPORT
expone soporte parcial para instancias en hardware de nivel de característica 9_1 y 9_2, que de lo contrario sería totalmente compatible desde el nivel de característica 9_3 en adelante. [103]
Direct3D 11.X
Direct3D 11.X es un superconjunto de DirectX 11.2 que se ejecuta en Xbox One . [104] [105] Incluye algunas características, como paquetes de dibujo, que luego se anunciaron como parte de DirectX 12. [106]
Direct3D 11.3 [107] se lanzó en julio de 2015 con Windows 10; incluye características de renderizado menores de Direct3D 12, al tiempo que mantiene la estructura general de la API de Direct3D 11.x. [108] [109] [110] Direct3D 11.3 presenta el valor de referencia de plantilla especificado por el sombreador opcional, cargas de vista de acceso desordenado tipificado, vistas ordenadas por rasterizador (ROV), Swizzle estándar opcional, mapeo de textura predeterminado opcional, rasterización conservadora (de tres niveles), [111] compatibilidad con acceso a memoria unificada (UMA) opcional y recursos en mosaico adicionales (nivel 2) (recursos en mosaico de volumen). [112]
Direct3D 12 [114] permite un nivel de abstracción de hardware más bajo que las versiones anteriores, lo que permite que las aplicaciones futuras mejoren significativamente el escalamiento multiproceso y reduzcan la utilización de la CPU. Esto se logra al hacer coincidir mejor la capa de abstracción de Direct3D con el hardware subyacente, a través de nuevas características como el dibujo indirecto, tablas de descriptores, objetos de estado de canalización concisos y paquetes de llamadas de dibujo. La reducción de la sobrecarga del controlador es el principal atractivo de Direct3D 12, de manera similar a Mantle de AMD . [114] En palabras de su desarrollador principal Max McMullen, el objetivo principal de Direct3D 12 es lograr una "eficiencia a nivel de consola" y un paralelismo de CPU mejorado. [115] [116] [117]
Aunque Nvidia ha anunciado un amplio soporte para Direct3D 12, también se mostró algo reservada sobre el atractivo universal de la nueva API, señalando que si bien los desarrolladores de motores de juegos pueden estar entusiasmados con la gestión directa de los recursos de la GPU desde el código de su aplicación, "mucha [otra] gente no estaría" contenta de tener que hacer eso. [118]
Algunas nuevas características de hardware también están en Direct3D 12, [110] [119] [120] incluyendo Shader Model 5.1, [121] Volume Tiled Resources (Tier 2), [121] Shader Specified Stencil Reference Value, Typed UAV Load, Conservative Rasterization (Tier 1), mejor colisión y eliminación con Conservative Rasterization, Rasterizer Ordered Views (ROVs), Swizzles estándar, Default Texture Mapping, Swap Chains, recursos swizzled y recursos comprimidos , [122] modos de mezcla adicionales , [123] mezcla programable y transparencia independiente del orden (OIT) eficiente con UAV ordenado por píxeles. [124]
Los objetos de estado de canalización (PSO) [125] han evolucionado a partir de Direct3D 11, y los nuevos estados de canalización concisos significan que el proceso se ha simplificado. DirectX 11 ofrecía flexibilidad en la forma en que se podían alterar sus estados, en detrimento del rendimiento. La simplificación del proceso y la unificación de las canalizaciones (por ejemplo, los estados de sombreado de píxeles) conducen a un proceso más optimizado, lo que reduce significativamente los gastos generales y permite que la tarjeta gráfica realice más llamadas para cada cuadro. Una vez creado, el PSO es inmutable. [126]
Las firmas raíz introducen configuraciones para vincular listas de comandos a los recursos requeridos por los sombreadores. Definen la disposición de los recursos que utilizarán los sombreadores y especifican qué recursos se vincularán a la canalización. Una lista de comandos gráficos tiene una firma raíz tanto gráfica como de cálculo, mientras que una lista de comandos de cálculo tendrá solo una firma raíz de cálculo. Estas firmas raíz son completamente independientes entre sí. Si bien la firma raíz establece los tipos de datos que deben utilizar los sombreadores, no define ni asigna la memoria o los datos reales. [127]
Los parámetros raíz son un tipo de entrada en una firma raíz. Los valores reales de los parámetros raíz que se modifican en tiempo de ejecución se denominan argumentos raíz. Estos son los datos que leen los sombreadores. [127]
En Direct3D 11, los comandos se envían desde la CPU a la GPU uno por uno, y la GPU procesa estos comandos de forma secuencial. Esto significa que los comandos se ven limitados por la velocidad a la que la CPU podría enviar estos comandos de forma lineal. En DirectX 12, estos comandos se envían como listas de comandos que contienen toda la información necesaria en un único paquete. La GPU es capaz de procesar y ejecutar este comando en un único proceso, sin tener que esperar ninguna información adicional de la CPU.
Dentro de estas listas de comandos se encuentran los paquetes. Mientras que antes los comandos solo se tomaban, se usaban y luego la GPU los olvidaba, los paquetes se pueden reutilizar. Esto reduce la carga de trabajo de la GPU y significa que los recursos repetidos se pueden usar mucho más rápido.
Si bien la vinculación de recursos es bastante conveniente en Direct3D 11 para los desarrolladores en este momento, su ineficiencia significa que varias capacidades de hardware modernas están siendo drásticamente infrautilizadas. Cuando un motor de juego necesitaba recursos en DX11, tenía que extraer los datos desde cero cada vez, lo que significaba procesos repetidos y usos innecesarios. En Direct3D 12, los montones y tablas de descriptores significan que los recursos más utilizados pueden ser asignados por los desarrolladores en tablas, a las que la GPU puede acceder de manera rápida y sencilla. Esto puede contribuir a un mejor rendimiento que Direct3D 11 en hardware equivalente, pero también implica más trabajo para el desarrollador.
Los montones dinámicos también son una característica de Direct3D 12. [128]
Direct3D 12 ofrece compatibilidad explícita con múltiples adaptadores, lo que permite el control explícito de sistemas de configuración de múltiples GPU. Dichas configuraciones se pueden crear con adaptadores gráficos del mismo proveedor de hardware o de diferentes proveedores de hardware juntos. [129]
Microsoft lanzó en 2019 un soporte experimental de D3D 12 para Windows 7 SP1 a través de un paquete NuGet dedicado. [130] [131] [132]
Direct3D es un componente del subsistema API de Microsoft DirectX . El objetivo de Direct3D es abstraer la comunicación entre una aplicación gráfica y los controladores de hardware de gráficos. Se presenta como una fina capa abstracta a un nivel comparable a GDI (ver diagrama adjunto). Direct3D contiene numerosas características de las que carece GDI.
Direct3D es una API de gráficos de modo inmediato . Proporciona una interfaz de bajo nivel para todas las funciones 3D de la tarjeta de video ( transformaciones, recorte, iluminación , materiales , texturas , almacenamiento en búfer de profundidad , etc.). En su momento, tenía un componente de modo retenido de nivel superior , que ahora se ha descontinuado oficialmente.
El modo inmediato de Direct3D presenta tres abstracciones principales: dispositivos , recursos y cadenas de intercambio (consulte el diagrama adjunto). Los dispositivos son responsables de renderizar la escena 3D. Proporcionan una interfaz con diferentes capacidades de renderizado. Por ejemplo, el dispositivo mono proporciona renderizado en blanco y negro, mientras que el dispositivo RGB renderiza en color. Hay cuatro tipos de dispositivos:
Cada dispositivo contiene al menos una cadena de intercambio . Una cadena de intercambio está formada por una o más superficies de búfer posterior . La representación se produce en el búfer posterior .
Además, los dispositivos contienen una colección de recursos ; datos específicos utilizados durante la representación. Cada recurso tiene cuatro atributos:
Direct3D implementa dos modos de visualización:
La API de Microsoft Direct3D 11 define un proceso para convertir un grupo de vértices, texturas, buffers y estados en una imagen en la pantalla. Este proceso se describe como una secuencia de renderizado con varias etapas distintas. Las diferentes etapas de la secuencia de Direct3D 11 son: [143]
Las etapas de la tubería ilustradas con un recuadro redondo son totalmente programables. La aplicación proporciona un programa de sombreado que describe las operaciones exactas que se deben completar para esa etapa. Muchas etapas son opcionales y se pueden desactivar por completo.
En Direct3D 5 a 9, cuando las nuevas versiones de la API introdujeron compatibilidad con nuevas capacidades de hardware, la mayoría de ellas eran opcionales: cada proveedor de gráficos mantenía su propio conjunto de funciones compatibles además de la funcionalidad básica requerida. La compatibilidad con funciones individuales debía determinarse mediante "bits de capacidad" o "límites", lo que hacía que la programación de gráficos entre proveedores fuera una tarea compleja.
Direct3D 10 introdujo un conjunto mucho más simplificado de requisitos de hardware obligatorios basados en las capacidades más populares de Direct3D 9, que todas las tarjetas gráficas compatibles debían cumplir, con solo unas pocas capacidades opcionales para operaciones y formatos de textura compatibles.
Direct3D 10.1 agregó algunos nuevos requisitos de hardware obligatorios y, para seguir siendo compatible con el hardware y los controladores de la versión 10.0, estas características se encapsularon en dos conjuntos llamados "niveles de características", y el nivel 10.1 forma un superconjunto del nivel 10.0. A medida que Direct3D 11.0, 11.1 y 12 agregaron compatibilidad con nuevo hardware, las nuevas capacidades obligatorias se agruparon aún más en niveles de características superiores. [56]
Direct3D 11 también introdujo "10level9", un subconjunto de la API de Direct3D 10 con tres niveles de características que encapsulan varias tarjetas Direct3D 9 con controladores WDDM , y Direct3D 11.1 reintrodujo algunas características opcionales para todos los niveles, [155] que se ampliaron en Direct3D 11.2 y versiones posteriores.
Este enfoque permite a los desarrolladores unificar el proceso de renderizado y utilizar una única versión de la API tanto en hardware nuevo como antiguo, aprovechando las mejoras de rendimiento y usabilidad en el entorno de ejecución más nuevo. [60]
Se introducen nuevos niveles de funciones con versiones actualizadas de la API y generalmente encapsulan:
Cada nivel superior es un superconjunto estricto de un nivel inferior, con solo unas pocas características nuevas o previamente opcionales que se trasladan a la funcionalidad principal en un nivel superior. [67] Las características más avanzadas en una revisión importante de la API de Direct3D, como nuevos modelos de sombreado y etapas de renderizado, solo se exponen en hardware de nivel superior. [65] [66]
Existen capacidades separadas para indicar soporte para operaciones de textura específicas y formatos de recursos; estas se especifican para cada formato de textura utilizando una combinación de indicadores de capacidad. [156] [157]
Los niveles de características utilizan un guión bajo como delimitador (es decir, "12_1"), mientras que las versiones de API/tiempo de ejecución utilizan un punto (es decir, "Direct3D 11.4").
En Direct3D 11.4 para Windows 10, hay nueve niveles de características proporcionados por D3D_FEATURE_LEVEL
estructura; los niveles 9_1, 9_2 y 9_3 (conocidos colectivamente como Direct3D 10 Nivel 9 ) vuelven a encapsular varias características de las populares tarjetas Direct3D 9, los niveles 10_0, 10_1 se refieren a las respectivas versiones heredadas de Direct3D 10, [65] 11_0 y 11_1 reflejan la característica introducida con las API y los tiempos de ejecución de Direct3D 11 y Direct3D 11.1, mientras que los niveles 12_0 y 12_1 corresponden a los nuevos niveles de características introducidos con la API de Direct3D 12.
Direct3D 12 para Windows 10 requiere hardware gráfico que cumpla con los niveles de características 11_0 y 11_1, que admiten traducciones de direcciones de memoria virtual y requieren controladores WDDM 2.0. Hay dos nuevos niveles de características, 12_0 y 12_1, que incluyen algunas características nuevas expuestas por Direct3D 12 que son opcionales en los niveles 11_0 y 11_1. [158] Algunas características que antes eran opcionales se reajustaron como base en los niveles 11_0 y 11_1. Shader Model 6.0 se lanzó con Windows 10 Creators Update y requiere Windows 10 Anniversary Update, controladores WDDM 2.1.
Direct3D 12 introduce un modelo de enlace de recursos renovado que permite el control explícito de la memoria. Los objetos abstractos de "vista de recursos" [160] ahora se representan con descriptores de recursos, que se asignan mediante montones y tablas de memoria. [161] Los niveles de enlace de recursos definen el número máximo de recursos que se pueden abordar mediante CBV (vista de búfer constante), SRV (vista de recursos de sombreado) y UAV (vista de acceso desordenado), así como unidades de muestreo de texturas. El hardware de nivel 3 permite recursos completamente sin enlaces restringidos solo por el tamaño del montón de descriptores, mientras que el hardware de nivel 1 y nivel 2 impone algunos límites en el número de descriptores ("vistas") que se pueden usar simultáneamente. [162] [163]
El modelo de controlador WDDM en Windows Vista y versiones posteriores admite una cantidad arbitraria de contextos de ejecución (o subprocesos) en hardware o en software. Windows XP solo admitía el acceso multitarea a Direct3D, donde las aplicaciones independientes podían ejecutarse en diferentes ventanas y ser aceleradas por hardware, y el sistema operativo tenía un control limitado sobre lo que podía hacer la GPU y el controlador podía cambiar los subprocesos de ejecución de forma arbitraria.
La capacidad de ejecutar el entorno de ejecución en un modo multiproceso se introdujo con el entorno de ejecución Direct3D 11. Cada contexto de ejecución se presenta con una vista de recursos de la GPU. Los contextos de ejecución están protegidos entre sí, sin embargo, una aplicación mal escrita o mal escrita puede tomar el control de la ejecución en el controlador del modo de usuario y potencialmente podría acceder a los datos de otro proceso dentro de la memoria de la GPU mediante el envío de comandos modificados. Aunque está protegida del acceso por parte de otra aplicación, una aplicación bien escrita aún necesita protegerse a sí misma contra fallas y pérdidas de dispositivos causadas por otras aplicaciones.
El sistema operativo administra los subprocesos por sí solo, lo que permite que el hardware cambie de un subproceso a otro cuando sea apropiado, y también maneja la administración de memoria y la paginación (a la memoria del sistema y al disco) a través de la administración de memoria integrada del kernel del sistema operativo.
El cambio de contexto de grano más fino, es decir, poder cambiar dos subprocesos de ejecución en el nivel de instrucción de sombreado en lugar del nivel de comando único o incluso de lote de comandos, se introdujo en WDDM/DXGI 1.2 que se envió con Windows 8. [86] Esto supera un problema de programación potencial cuando la aplicación tendría una ejecución muy larga de un solo comando/lote de comandos y tendría que ser finalizada por el temporizador de vigilancia del sistema operativo. [164]
Se han rediseñado WDDM 2.0 y DirectX 12 para permitir llamadas de dibujo totalmente multiproceso. Esto se logró haciendo que todos los recursos sean inmutables (es decir, de solo lectura), serializando los estados de renderizado y utilizando paquetes de llamadas de dibujo. Esto evita la gestión compleja de recursos en el controlador de modo kernel, lo que hace posible múltiples llamadas reentrantes al controlador de modo usuario a través de contextos de ejecuciones simultáneas proporcionados por subprocesos de renderizado separados en la misma aplicación.
Direct3D Mobile se deriva de Direct3D pero ocupa menos memoria . Windows CE ofrece compatibilidad con Direct3D Mobile. [165]
Existen las siguientes implementaciones alternativas de la API de Direct3D. Son útiles para plataformas que no sean Windows y para hardware que no admita algunas versiones de DX:
Direct3D viene con D3DX, una biblioteca de herramientas diseñadas para realizar cálculos matemáticos comunes en vectores , matrices y colores, calcular matrices de proyección y de observación , interpolaciones de splines y varias tareas más complicadas, como compilar o ensamblar sombreadores utilizados para programación gráfica 3D, almacenamiento de animación esquelética comprimida y pilas de matrices. Hay varias funciones que proporcionan operaciones complejas sobre mallas 3D como cálculo de espacio tangente, simplificación de malla, transferencia de radiancia precalculada , optimización para la compatibilidad con caché de vértices y stripificación, y generadores para mallas de texto 3D. Las características 2D incluyen clases para dibujar líneas de espacio de pantalla, sistemas de partículas basados en texto y sprites . Las funciones espaciales incluyen varias rutinas de intersección, conversión desde/hacia coordenadas baricéntricas y generadores de cuadros delimitadores /esferas. D3DX se proporciona como una biblioteca de vínculos dinámicos (DLL). D3DX está obsoleto desde Windows 8 en adelante y no se puede usar en aplicaciones de la Tienda Windows. [180]
Algunas características presentes en versiones anteriores de D3DX se eliminaron en Direct3D 11 y ahora se proporcionan como fuentes independientes: [181]
DXUT (también llamado framework de muestra) es una capa construida sobre la API de Direct3D. El framework está diseñado para ayudar al programador a dedicar menos tiempo a tareas rutinarias, como crear una ventana, crear un dispositivo, procesar mensajes de Windows y manejar eventos de dispositivos. DXUT se eliminó con el SDK de Windows 8.0 y ahora se distribuye como fuente a través de CodePlex. [189]
{{cite web}}
: CS1 maint: bot: original URL status unknown (link){{cite web}}
: CS1 maint: unfit URL (link)La primera y más importante de las nuevas características de Maxwell 2 es la inclusión de compatibilidad total con Direct3D 11.2/11.3.
{{cite web}}
: CS1 maint: archived copy as title (link)