Remove ads
API used in Microsoft DirectX for 3D rendering From Wikipedia, the free encyclopedia
Direct3D is a graphics application programming interface (API) for Microsoft Windows. Part of DirectX, Direct3D is used to render three-dimensional graphics in applications where performance is important, such as games. Direct3D uses hardware acceleration if available on the graphics card, allowing for hardware acceleration of the entire 3D rendering pipeline or even only partial acceleration. Direct3D exposes the advanced graphics capabilities of 3D graphics hardware, including Z-buffering,[1] W-buffering,[2] stencil buffering, spatial anti-aliasing, alpha blending, color blending, mipmapping, texture blending,[3][4] clipping, culling, atmospheric effects, perspective-correct texture mapping, programmable HLSL shaders[5] and effects.[6] Integration with other DirectX technologies enables Direct3D to deliver such features as video mapping, hardware 3D rendering in 2D overlay planes, and even sprites, providing the use of 2D and 3D graphics in interactive media ties.
This article needs additional citations for verification. (January 2014) |
Developer(s) | Microsoft |
---|---|
Initial release | June 2, 1996 |
Stable release | 12.0 Beta 3
/ January 13, 2015 |
Operating system | Microsoft Windows, Windows CE, Windows Embedded, Xbox system software |
Platform | x86, ARM |
Type | 3D computer graphics API |
License | Proprietary |
Website | learn |
Direct3D contains many commands for 3D computer graphics rendering; however, since version 8, Direct3D has superseded the DirectDraw framework and also taken responsibility for the rendering of 2D graphics.[7] Microsoft strives to continually update Direct3D to support the latest technology available on 3D graphics cards. Direct3D offers full vertex software emulation but no pixel software emulation for features not available in hardware. For example, if software programmed using Direct3D requires pixel shaders and the video card on the user's computer does not support that feature, Direct3D will not emulate it, although it will compute and render the polygons and textures of the 3D models, albeit at a usually degraded quality and performance compared to the hardware equivalent. The API does include a Reference Rasterizer (or REF device), which emulates a generic graphics card in software, although it is too slow for most real-time 3D applications and is typically only used for debugging. A new real-time software rasterizer, WARP, designed to emulate the complete feature set of Direct3D 10.1, is included with Windows 7 and Windows Vista Service Pack 2 with the Platform Update; its performance is said to be on par with lower-end 3D cards on multi-core CPUs.[8]
As part of DirectX, Direct3D is available for Windows 95 and above, and is the base for the vector graphics API on the different versions of Xbox console systems. The Wine compatibility layer, a free software reimplementation of several Windows APIs, includes an implementation of Direct3D.
Direct3D's main competitor is Khronos' OpenGL and its follow-on Vulkan. Fahrenheit was an attempt by Microsoft and SGI to unify OpenGL and Direct3D in the 1990s, but was eventually canceled.
In 1992, Servan Keondjian, Doug Rabson and Kate Seekings started a company named RenderMorphics, which developed a 3D graphics API named Reality Lab, which was used in medical imaging and CAD software.[15] Two versions of this API were released.[16] Microsoft bought RenderMorphics in February 1995, bringing its staff on board to implement a 3D graphics engine for Windows 95.[17] The first version of Direct3D shipped in DirectX 2.0 (June 2, 1996) and DirectX 3.0 (September 26, 1996).
Direct3D initially implemented an "immediate mode" 3D API and layered upon it a "retained mode" 3D API.[18] Both types of API were already offered with the second release of Reality Lab before Direct3D was released.[16] Like other DirectX APIs, such as DirectDraw, both were based on COM. The retained mode API was a scene graph API that attained little adoption. Game developers clamored for more direct control of the hardware's activities than the Direct3D retained mode could provide. Only two games that sold a significant volume, Lego Island and Lego Rock Raiders, were based on the Direct3D retained mode, so Microsoft did not update the retained mode API after DirectX 3.0.
For DirectX 2.0 and 3.0, the Direct3D immediate mode used an "execute buffer" programming model that Microsoft hoped hardware vendors would support directly. Execute buffers were intended to be allocated in hardware memory and parsed by the hardware to perform the 3D rendering. They were considered extremely awkward to program at the time, however, hindering adoption of the new API and prompting calls for Microsoft to adopt OpenGL as the official 3D rendering API for games as well as workstation applications.[19] (see OpenGL vs. Direct3D)
Rather than adopt OpenGL as a gaming API, Microsoft chose to continue improving Direct3D, not only to be competitive with OpenGL, but to compete more effectively with other proprietary APIs such as 3dfx's Glide.
From the beginning, the immediate mode also supported Talisman's tiled rendering with the BeginScene/EndScene methods of the IDirect3DDevice interface.
No substantive changes were planned to Direct3D for DirectX 4.0, which was scheduled to ship in late 1996 and then canceled.[20]
In December 1996, a team in Redmond took over development of the Direct3D Immediate Mode, while the London-based RenderMorphics team continued work on the Retained Mode. The Redmond team added the DrawPrimitive API that eliminated the need for applications to construct execute buffers, making Direct3D more closely resemble other immediate mode rendering APIs such as Glide and OpenGL. The first beta of DrawPrimitive shipped in February 1997,[21] and the final version shipped with DirectX 5.0 in August 1997.[22]
Besides introducing an easier-to-use immediate mode API, DirectX 5.0 added the SetRenderTarget method that enabled Direct3D devices to write their graphical output to a variety of DirectDraw surfaces.[23]
DirectX 6.0 (released in August, 1998) introduced numerous features to cover contemporary hardware (such as multitexture[24] and stencil buffers) as well as optimized geometry pipelines for x87, SSE and 3DNow! and optional texture management to simplify programming.[25] Direct3D 6.0 also included support for features that had been licensed by Microsoft from specific hardware vendors for inclusion in the API, in exchange for the time-to-market advantage to the licensing vendor. S3 texture compression support was one such feature, renamed as DXTC for purposes of inclusion in the API. Another was TriTech's proprietary bump mapping technique. Microsoft included these features in DirectX, then added them to the requirements needed for drivers to get a Windows logo to encourage broad adoption of the features in other vendors' hardware.
A minor update to DirectX 6.0 came in the February, 1999 DirectX 6.1 update. Besides adding DirectMusic support for the first time, this release improved support for Intel Pentium III 3D extensions.[26]
A confidential memo sent in 1997[27] shows Microsoft planning to announce full support for Talisman in DirectX 6.0, but the API ended up being canceled (See the Microsoft Talisman page for details).
DirectX 7.0 (released in September, 1999) introduced the .dds texture format[28] and support for transform and lighting hardware acceleration[29] (first available on PC hardware with Nvidia's GeForce 256), as well as the ability to allocate vertex buffers in hardware memory. Hardware vertex buffers represent the first substantive improvement over OpenGL in DirectX history. Direct3D 7.0 also augmented DirectX support for multitexturing hardware, and represents the pinnacle of fixed-function multitexture pipeline features: although powerful, it was so complicated to program that a new programming model was needed to expose the shading capabilities of graphics hardware. Direct3D 7.0 also introduced DXVA features.
DirectX 8.0 (released in November, 2000) introduced programmability in the form of vertex and pixel shaders, enabling developers to write code without worrying about superfluous hardware state.[30] The complexity of the shader programs depended on the complexity of the task, and the display driver compiled those shaders to instructions that could be understood by the hardware. Direct3D 8.0 and its programmable shading capabilities were the first major departure from an OpenGL-style fixed-function architecture, where drawing is controlled by a complicated state machine. Direct3D 8.0 also eliminated DirectDraw as a separate API.[31][32] Direct3D subsumed all remaining DirectDraw API calls still needed for application development, such as Present(), the function used to display rendering results.
Direct3D was not considered to be user friendly, but as of DirectX version 8.1, many usability problems were resolved. Direct3D 8 contained many powerful 3D graphics features, such as vertex shaders, pixel shaders, fog, bump mapping and texture mapping.
Direct3D 9.0[33] (released in December, 2002) added a new version of the High Level Shader Language[34][35] support for floating-point texture formats, Multiple Render Targets (MRT),[36] Multiple-Element Textures,[37] texture lookups in the vertex shader and stencil buffer techniques.[38]
Direct3D 9Ex[39] (previously versioned 9.0L ("L" standing for Longhorn, the codename for Windows Vista)), an extension only available in Windows Vista, 7, 8, 8.1, 10, and 11, allows the use of the advantages offered by Windows Vista's Windows Display Driver Model (WDDM) and is used for Windows Aero.[40] Direct3D 9Ex, in conjunction with DirectX 9 class WDDM drivers allows graphics memory to be virtualized and paged out to system memory, allows graphics operations to be interrupted and scheduled and allow DirectX surfaces to be shared across processes.[41] Direct3D 9Ex was previously known as version 1.0 of Windows Graphics Foundation (WGF).
Windows Vista includes a major update to the Direct3D API. Originally called WGF 2.0 (Windows Graphics Foundation 2.0), then DirectX 10 and DirectX Next, Direct3D 10[42] features an updated shader model 4.0 and optional interruptibility for shader programs.[41] In this model shaders still consist of fixed stages as in previous versions, but all stages support a nearly unified interface, as well as a unified access paradigm for resources such as textures and shader constants. The language itself has been extended to be more expressive, including integer operations, a greatly increased instruction count, and more C-like language constructs. In addition to the previously available vertex and pixel shader stages, the API includes a geometry shader stage that breaks the old model of one vertex in/one vertex out, to allow geometry to be generated from within a shader, thus allowing for complex geometry to be generated entirely by the graphics hardware.
Windows XP and earlier are not supported by DirectX 10.0 and above. Furthermore, Direct3D 10 dropped support for the retained mode API which had been a part of Direct3D since the beginning, making Windows Vista incompatible with 3D games that had used the retained mode API as their rendering engine.[43]
Unlike prior versions of the API, Direct3D 10 no longer uses "capability bits" (or "caps") to indicate which features are supported on a given graphics device. Instead, it defines a minimum standard of hardware capabilities which must be supported for a display system to be "Direct3D 10 compatible". This is a significant departure, with the goal of streamlining application code by removing capability-checking code and special cases based on the presence or absence of specific capabilities.
Because Direct3D 10 hardware was comparatively rare after the initial release of Windows Vista and because of the massive install base of non-Direct3D 10 compatible graphics cards, the first Direct3D 10-compatible games still provide Direct3D 9 render paths. Examples of such titles are games originally written for Direct3D 9 and ported to Direct3D 10 after their release, such as Company of Heroes, or games originally developed for Direct3D 9 with a Direct3D 10 path retrofitted later during their development, such as Hellgate: London or Crysis. The DirectX 10 SDK became available in February 2007.[44]
Direct3D 10.0 level hardware must support the following features: the ability to process entire primitives in the new geometry-shader stage, the ability to output pipeline-generated vertex data to memory using the stream-output stage, multisampled alpha-to-coverage support, readback of a depth/stencil surface or a multisampled resource once it is no longer bound as a render target, full HLSL integration – all Direct3D 10 shaders are written in HLSL and implemented with the common-shader core, integer and bitwise shader operations, organization of pipeline state into 5 immutable state objects, organization of shader constants into constant buffers, increased number of render targets, textures, and samplers, no shader length limit, new resource types and resource formats,[45] layered runtime/API layers,[46] option to perform per-primitive material swapping and setup using a geometry shader, increased generalization of resource access using a view, removed legacy hardware capability bits (caps).
Direct3D 10.1[52] was announced by Microsoft shortly after the release of Direct3D 10 as a minor update. The specification was finalized with the release of November 2007 DirectX SDK and the runtime was shipped with the Windows Vista SP1, which is available since mid-March 2008.
Direct3D 10.1 sets a few more image quality standards for graphics vendors, and gives developers more control over image quality.[53][54] Features include finer control over anti-aliasing (both multisampling and supersampling with per sample shading and application control over sample position) and more flexibilities to some of the existing features (cubemap arrays and independent blending modes). Direct3D 10.1 level hardware must support the following features: Multisampling has been enhanced to generalize coverage based transparency and make multisampling work more effectively with multi-pass rendering, better culling behavior – Zero-area faces are automatically culled; this affects wireframe rendering only, independent blend modes per render target, new sample-frequency pixel shader execution with primitive rasterization, increased pipeline stage bandwidth, both color and depth/stencil MSAA surfaces can now be used with CopyResource as either a source or destination, MultisampleEnable only affects line rasterization (points and triangles are unaffected), and is used to choose a line drawing algorithm. This means that some multisample rasterization from Direct3D 10 are no longer supported, Texture Sampling – sample_c and sample_c_lz instructions are defined to work with both Texture2DArrays and TextureCubeArrays use the Location member (the alpha component) to specify an array index, support for TextureCubeArrays.
Unlike Direct3D 10 which strictly required Direct3D 10-class hardware and driver interfaces, Direct3D 10.1 runtime can run on Direct3D 10.0 hardware using a concept of "feature levels",[56][57][58] but new features are supported exclusively by new hardware which expose feature level 10_1.
The only available Direct3D 10.1 hardware as of June 2008 were the Radeon HD 3000 series and Radeon HD 4000 series from ATI; in 2009, they were joined by Chrome 430/440GT GPUs from S3 Graphics and select lower-end models in GeForce 200 series from Nvidia. In 2011, Intel chipsets started supporting Direct3D 10.1 with the introduction of Intel HD Graphics 2000 (GMA HD).
Direct3D 11[59] was released as part of Windows 7. It was presented at Gamefest 2008 on July 22, 2008 and demonstrated at the Nvision 08 technical conference on August 26, 2008.[60][61] The Direct3D 11 Technical Preview has been included in November 2008 release of DirectX SDK.[62] AMD previewed working DirectX11 hardware at Computex on June 3, 2009, running some DirectX 11 SDK samples.[63]
The Direct3D 11 runtime is able to run on Direct3D 9 and 10.x-class hardware and drivers using the concept of "feature levels", expanding on the functionality first introduced in Direct3D 10.1 runtime.[56][64][65] Feature levels allow developers to unify the rendering pipeline under Direct3D 11 API and make use of API improvements such as better resource management and multithreading even on entry-level cards, though advanced features such as new shader models and rendering stages will only be exposed on up-level hardware.[64][66] There are three "10 Level 9" profiles which encapsulate various capabilities of popular DirectX 9.0a cards, and Direct3D 10, 10.1, and 11 each have a separate feature level; each upper level is a strict superset of a lower level.[67]
Tessellation was earlier considered for Direct3D 10, but was later abandoned. GPUs such as Radeon R600 feature a tessellation engine that can be used with Direct3D 9/10/10.1[68][69][70] and OpenGL,[71] but it's not compatible with Direct3D 11 (according to Microsoft). Older graphics hardware such as Radeon 8xxx, GeForce 3/4 had support for another form of tesselation (RT patches, N patches) but those technologies never saw substantial use. As such, their support was dropped from newer hardware.
Microsoft has also hinted at other features such as order independent transparency, which was never exposed by the Direct3D API but supported almost transparently by early Direct3D hardware such as Videologic's PowerVR line of chips.
Direct3D 11.0 features include: Support for Shader Model 5.0, Dynamic shader linking, addressable resources, additional resource types,[72] subroutines, geometry instancing, coverage as pixel shader input, programmable interpolation of inputs, new texture compression formats (1 new LDR format and 1 new HDR format), texture clamps to limit WDDM preload, require 8-bits of subtexel and sub-mip precision on texture filtering, 16K texture limits, Gather4(support for multi-component textures, support for programmable offsets), DrawIndirect, conservative oDepth, Depth Bias,[73][74] addressable stream output, per-resource mipmap clamping, floating-point viewports, shader conversion instructions, improved multithreading.
Other notable features are the addition of two new texture compression algorithms for more efficient packing of high quality and HDR/alpha textures and an increased texture cache.
First seen in the Release Candidate version, Windows 7 integrates the first released Direct3D 11 support. The Platform Update for Windows Vista includes full-featured Direct3D 11 runtime and DXGI 1.1 update, as well as other related components from Windows 7 like WARP, Direct2D, DirectWrite, and WIC.[78][79]
Direct3D 11.1[80][81] is an update to the API that ships with Windows 8.[82][83] The Direct3D runtime in Windows 8 features DXGI 1.2[84] and requires new WDDM 1.2[85] device drivers.[86] Preliminary version of the Windows SDK for Windows 8 Developer Preview was released on September 13, 2011.
The new API features shader tracing and HLSL compiler enhancements, support for minimum precision HLSL scalar data types,[87] UAVs (Unordered Access Views) at every pipeline stage, target-independent rasterization (TIR), option to map SRVs of dynamic buffers with NO_OVERWRITE, shader processing of video resources, option to use logical operations in a render target, option to bind a subrange of a constant buffer to a shader and retrieve it, option to create larger constant buffers than a shader can access, option to discard resources and resource views, option to change subresources with new copy options, option to force the sample count to create a rasterizer state, option to clear all or part of a resource view, option to use Direct3D in Session 0 processes, option to specify user clip planes in HLSL on feature level 9 and higher, support for shadow buffer on feature level 9, support for video playback, extended support for shared Texture2D resources, and on-the-fly swapping between Direct3D 10 and 11 contexts and feature levels. Direct3D 11.1 includes new feature level 11_1, which brings minor updates to the shader language, such as larger constant buffers and optional double-precision instructions, as well as improved blending modes and mandatory support for 16-bit color formats to improve the performance of entry-level GPUs such as Intel HD Graphics.[86][88] WARP has been updated to support feature level 11_1.
The Platform Update for Windows 7 includes a limited set of features from Direct3D 11.1, though components that depend on WDDM 1.2 – such as feature level 11_1 and its related APIs, or quad buffering for stereoscopic rendering – are not present.[89][90]
Direct3D 11.2[91][92][93] was shipped with Windows 8.1.[94][95] New hardware features require DXGI 1.3[96] with WDDM 1.3[97] drivers and include runtime shader modification and linking, Function linking graph(FLG), inbox HLSL compiler, option to annotate graphics commands.[98] Feature levels 11_0 and 11_1 introduce optional support for tiled resources with shader level of detail clamp (Tier2).[99] The latter feature effectively provides control over the hardware page tables present in many current GPUs.[100] WARP was updated to fully support the new features.[94][101] There is no feature level 11_2 however; the new features are dispersed across existing feature levels. Those that are hardware-dependent can be checked individually via CheckFeatureSupport
.[95][102] Some of the "new" features in Direct3D 11.2 actually expose some old hardware features in a more granular way; for example D3D11_FEATURE_D3D9_SIMPLE_INSTANCING_SUPPORT
exposes partial support for instancing on feature level 9_1 and 9_2 hardware, otherwise fully supported from feature level 9_3 onward.[103]
Direct3D 11.X
Direct3D 11.X is a superset of DirectX 11.2 running on the Xbox One.[104][105] It includes some features, such as draw bundles, that were later announced as part of DirectX 12.[106]
Direct3D 11.3[107] shipped in July 2015 with Windows 10; it includes minor rendering features from Direct3D 12, while keeping the overall structure of the Direct3D 11.x API.[108][109][110] Direct3D 11.3 introduces optional Shader Specified Stencil Reference Value, Typed Unordered Access View Loads, Rasterizer Ordered Views (ROVs), optional Standard Swizzle, optional Default Texture Mapping, Conservative Rasterization (out of three tiers),[111] optional Unified Memory Access (UMA) support, and additional Tiled Resources (tier 2) (Volume tiled resources).[112]
Direct3D 12[114] allows a lower level of hardware abstraction than earlier versions, enabling future applications to significantly improve multithreaded scaling and decrease CPU utilization. This is achieved by better matching the Direct3D abstraction layer with the underlying hardware, through new features such as Indirect Drawing, descriptor tables, concise pipeline state objects, and draw call bundles. Reducing driver overhead is the main attraction of Direct3D 12, similarly to AMD's Mantle.[114] In the words of its lead developer Max McMullen, the main goal of Direct3D 12 is to achieve "console-level efficiency" and improved CPU parallelism.[115][116][117]
Although Nvidia has announced broad support for Direct3D 12, they were also somewhat reserved about the universal appeal of the new API, noting that while game engine developers may be enthusiastic about directly managing GPU resources from their application code, "a lot of [other] folks wouldn't" be happy to have to do that.[118]
Some new hardware features are also in Direct3D 12,[110][119][120] including Shader Model 5.1,[121] Volume Tiled Resources(Tier 2),[121] Shader Specified Stencil Reference Value, Typed UAV Load, Conservative Rasterization(Tier 1), better collision and culling with Conservative Rasterization, Rasterizer Ordered Views (ROVs), Standard Swizzles, Default Texture Mapping, Swap Chains, swizzled resources and compressed resources,[122] additional blend modes,[123] programmable blend and efficient order-independent transparency (OIT) with pixel ordered UAV.[124]
Pipeline state objects (PSOs)[125] have evolved from Direct3D 11, and the new concise pipeline states mean that the process has been simplified. DirectX 11 offered flexibility in how its states could be altered, to the detriment of performance. Simplifying the process and unifying the pipelines (e.g. pixel shader states) lead to a more streamlined process, significantly reducing the overheads and allowing the graphics card to draw more calls for each frame. Once created, the PSO is immutable.[126]
Root signatures introduce configurations to link command lists to resources required by shaders. They define the layout of resources that shaders will use and specifies what resources will be bound to the pipeline. A graphics command list has both a graphics and compute root signature, while a compute command list will have only a compute root signature. These root signatures are completely independent of each other. While the root signature lays out the types of data for shaders to use, it does not define or map the actual memory or data.[127]
Root parameters are one type of entry in a root signature. The actual values of the root parameters that are modified at runtime are called root arguments. This is the data that the shaders read.[127]
Within Direct3D 11, the commands are sent from the CPU to the GPU one by one, and the GPU works through these commands sequentially. This means that commands are bottlenecked by the speed at which the CPU could send these commands in a linear fashion. Within DirectX 12 these commands are sent as command lists, containing all the required information within a single package. The GPU is then capable of computing and executing this command in one single process, without having to wait on any additional information from the CPU.
Within these command lists are bundles. Where previously commands were just taken, used, and then forgotten by the GPU, bundles can be reused. This decreases the workload of the GPU and means repeated assets can be used much faster.
While resource binding is fairly convenient in Direct3D 11 for developers at the moment, its inefficiency means several modern hardware capabilities are being drastically underused. When a game engine needed resources in DX11, it had to draw the data from scratch every time, meaning repeat processes and unnecessary uses. In Direct3D 12, descriptor heaps and tables mean the most often used resources can be allocated by developers in tables, which the GPU can quickly and easily access. This can contribute to better performance than Direct3D 11 on equivalent hardware, but it also entails more work for the developer.
Dynamic Heaps are also a feature of Direct3D 12.[128]
Direct3D 12 features explicit multi-adapter support, allowing the explicit control of multiple GPUs configuration systems. Such configurations can be built with graphics adapter of the same hardware vendor as well of different hardware vendor together.[129]
An experimental support of D3D 12 for Windows 7 SP1 has been released by Microsoft in 2019 via a dedicated NuGet package.[130][131][132]
This section needs to be updated. (August 2014) |
Direct3D is a Microsoft DirectX API subsystem component. The aim of Direct3D is to abstract the communication between a graphics application and the graphics hardware drivers. It is presented like a thin abstract layer at a level comparable to GDI (see attached diagram). Direct3D contains numerous features that GDI lacks.
Direct3D is an Immediate mode graphics API. It provides a low-level interface to every video card 3D function (transformations, clipping, lighting, materials, textures, depth buffering and so on). It once had a higher level Retained mode component, now officially discontinued.
Direct3D immediate mode presents three main abstractions: devices, resources and Swap Chains (see attached diagram). Devices are responsible for rendering the 3D scene. They provide an interface with different rendering capabilities. For example, the mono device provides white and black rendering, while the RGB device renders in color. There are four types of devices:
Every device contains at least one swap chain. A swap chain is made up of one or more back buffer surfaces. Rendering occurs in the back buffer.
Moreover, devices contain a collection of resources; specific data used during rendering. Each resource has four attributes:
Direct3D implements two display modes:
The Microsoft Direct3D 11 API defines a process to convert a group of vertices, textures, buffers, and state into an image on the screen. This process is described as a rendering pipeline with several distinct stages. The different stages of the Direct3D 11 pipeline are:[143]
The pipeline stages illustrated with a round box are fully programmable. The application provides a shader program that describes the exact operations to be completed for that stage. Many stages are optional and can be disabled altogether.
In Direct3D 5 to 9, when new versions of the API introduced support for new hardware capabilities, most of them were optional – each graphics vendor maintained their own set of supported features in addition to the basic required functionality. Support for individual features had to be determined using "capability bits" or "caps", making cross-vendor graphics programming a complex task.
Direct3D 10 introduced a much simplified set of mandatory hardware requirements based on most popular Direct3D 9 capabilities which all supporting graphics cards had to adhere to, with only a few optional capabilities for supported texture formats and operations.
Direct3D 10.1 added a few new mandatory hardware requirements, and to remain compatible with 10.0 hardware and drivers, these features were encapsulated in two sets called "feature levels", with 10.1 level forming a superset of 10.0 level. As Direct3D 11.0, 11.1 and 12 added support for new hardware, new mandatory capabilities were further grouped in upper feature levels.[56]
Direct3D 11 also introduced "10level9", a subset of the Direct3D 10 API with three feature levels encapsulating various Direct3D 9 cards with WDDM drivers, and Direct3D 11.1 re-introduced a few optional features for all levels,[155] which were expanded in Direct3D 11.2 and later versions.
This approach allows developers to unify the rendering pipeline and use a single version of the API on both newer and older hardware, taking advantage of performance and usability improvements in the newer runtime.[60]
New feature levels are introduced with updated versions of the API and typically encapsulate:
Each upper level is a strict superset of a lower level, with only a few new or previously optional features that move to the core functionality on an upper level.[67] More advanced features in a major revision of the Direct3D API such as new shader models and rendering stages are only exposed on up-level hardware.[65][66]
Separate capabilities exist to indicate support for specific texture operations and resource formats; these are specified per each texture format using a combination of capability flags.[156][157]
Feature levels use underscore as a delimiter (i.e. "12_1"), while API/runtime versions use dot (i.e. "Direct3D 11.4").
In Direct3D 11.4 for Windows 10, there are nine feature levels provided by D3D_FEATURE_LEVEL
structure; levels 9_1, 9_2 and 9_3 (collectively known as Direct3D 10 Level 9) re-encapsulate various features of popular Direct3D 9 cards, levels 10_0, 10_1 refer to respective legacy versions of Direct3D 10,[65] 11_0 and 11_1 reflects the feature introduced with Direct3D 11 and Direct3D 11.1 APIs and runtimes, while levels 12_0 and 12_1 correspond the new feature levels introduced with the Direct3D 12 API.
Feature level | Mandatory hardware features | Optional features |
---|---|---|
9_1 | Shader Model 2.0 (vs_2_0 /ps_2_0 ), 2K textures, volume textures, event queries, BC1-3 (a.k.a. DXTn), a few other specific capabilities. |
— |
9_2 | Occlusion queries, floating-point formats (no blending), extended caps, all 9_1 features. | |
9_3 | vs_2_a /ps_2_x with instancing and additional shader caps, 4K textures, multiple render targets (4 MRTs), floating-point blending (limited), all 9_2 features. | |
10_0 | Shader Model 4.0, geometry shader, stream out, alpha-to-coverage, 8K textures, MSAA textures, 2-sided stencil, general render target views, texture arrays, BC4/BC5, full floating-point format support, all 9_3 features. | Logical blend operations, DirectCompute (CS 4.0/4.1), extended pixel formats.[155] |
10_1 | Shader Model 4.1, cubemap arrays, extended MSAA, all 10_0 features. | |
11_0 | Shader Model 5.0/5.1, hull & domain shaders, DirectCompute (CS 5.0/5.1), 16K textures, BC6H/BC7, extended pixel formats, all 10_1 features. | |
11_1 | Logical blend operations, target-independent rasterization, UAVs at every pipeline stage with increased slot count, UAV only rendering with force sample count, constant buffer offsetting and partial updates, all 11_0 features. | |
12_0 | Tiled Resources Tier 2 (Texture2D), Typed UAV Loads (additional formats). | |
12_1 | Conservative Rasterization Tier 1, Rasterizer Ordered Views. |
Direct3D 12 for Windows 10 requires graphics hardware conforming to feature levels 11_0 and 11_1 which support virtual memory address translations and requires WDDM 2.0 drivers. There are two new feature levels, 12_0 and 12_1, which include some new features exposed by Direct3D 12 that are optional on levels 11_0 and 11_1.[158] Some previously optional features are realigned as baseline on levels 11_0 and 11_1. Shader Model 6.0 has been released with Windows 10 Creators Update and requires Windows 10 Anniversary Update, WDDM 2.1 drivers.
Level | Mandatory features | Optional features |
---|---|---|
11_0 | All mandatory 11_0 features from Direct3D 11, Shader Model 5.1, Resource binding Tier 1. | Logical blend operations, double precision (64-bit) floating point operations, minimum floating point precision (10- or 16-bit).
Resource binding (three tiers), tiled resources (four tiers), conservative rasterization (three tiers), stencil reference value from Pixel Shader, rasterizer ordered views, typed UAV loads for additional formats, view instancing. Shader Model 6.0–6.7 Metacommands, variable shading rate, raytracing, mesh shaders, sampler feedback. Other optional features.[159] |
11_1 | ||
12_0 | Resource Binding Tier 2, Tiled Resources Tier 2 (Texture2D), Typed UAV Loads (additional formats), Shader Model 6.0. | |
12_1 | Conservative Rasterization Tier 1, Rasterizer Ordered Views. | |
12_2 | DirectX 12 Ultimate: Shader Model 6.5, Raytracing Tier 1.1, Mesh Shaders, Variable-Rate Shading, Sampler Feedback, Resource Binding Tier 3, Tiled Resources Tier 3 (Texture3D), Conservative Rasterization Tier 3, 40-bit virtual address space. |
Direct3D 12 introduces a revamped resource binding model which allows explicit control of memory. Abstract "resource view" objects[160] are now represented with resource descriptors, which are allocated using memory heaps and tables.[161] Resource Binding tiers define maximum number of resources that can be addressed using CBV (constant buffer view), SRV (shader resource view) and UAV (unordered access view), as well as texture sampler units. Tier 3 hardware allows fully bindless resources only restricted by the size of the descriptor heap, while Tier 1 and Tier 2 hardware impose some limits on the number of descriptors ("views") that can be used simultaneously.[162][163]
Resource limits | Tier 1 | Tier 2 | Tier 3 |
---|---|---|---|
Descriptors in CBV/SRV/UAV heap | 1M | 1M | >1M |
CBVs per shader stage | 14 | 14 | full heap |
SRVs per shader stage | 128 | full heap | |
UAVs across all stages | 8, 64† | 64 | full heap |
Samplers per shader stage | 16 | full heap | |
† 64 slots on feature level 11_1 hardware |
WDDM driver model in Windows Vista and higher supports arbitrarily large number of execution contexts (or threads) in hardware or in software. Windows XP only supported multitasked access to Direct3D, where separate applications could execute in different windows and be hardware accelerated, and the OS had limited control about what the GPU could do and the driver could switch execution threads arbitrarily.
The ability to execute the runtime in a multi-threaded mode has been introduced with Direct3D 11 runtime. Each execution context is presented with a resource view of the GPU. Execution contexts are protected from each other, however a rogue or badly written app can take control of the execution in the user-mode driver and could potentially access data from another process within GPU memory by sending modified commands. Though protected from access by another app, a well-written app still needs to protect itself against failures and device loss caused by other applications.
The OS manages the threads all by itself, allowing the hardware to switch from one thread to the other when appropriate, and also handles memory management and paging (to system memory and to disk) via integrated OS-kernel memory management.
Finer-grained context switching, i.e. being able to switch two execution threads at the shader-instruction level instead of the single-command level or even batch of commands, was introduced in WDDM/DXGI 1.2 which shipped with Windows 8.[86] This overcomes a potential scheduling problem when application would have very long execution of a single command/batch of commands and will have to be terminated by the OS watchdog timer.[164]
WDDM 2.0 and DirectX 12 have been reengineered to allow fully multithreaded draw calls. This was achieved by making all resources immutable (i.e. read-only), serializing the rendering states and using draw call bundles. This avoids complex resource management in the kernel-mode driver, making possible multiple reentrant calls to the user-mode driver via concurrent executions contexts supplied by separate rendering threads in the same application.
Direct3D Mobile is derived from Direct3D but has a smaller memory footprint. Windows CE provides Direct3D Mobile support.[165]
The following alternative implementations of Direct3D API exist. They are useful for non-Windows platforms and for hardware without some versions of DX support:
Direct3D comes with D3DX, a library of tools designed to perform common mathematical calculations on vectors, matrices and colors, calculating look-at and projection matrices, spline interpolations, and several more complicated tasks, such as compiling or assembling shaders used for 3D graphic programming, compressed skeletal animation storage and matrix stacks. There are several functions that provide complex operations over 3D meshes like tangent-space computation, mesh simplification, precomputed radiance transfer, optimizing for vertex cache friendliness and stripification, and generators for 3D text meshes. 2D features include classes for drawing screen-space lines, text and sprite based particle systems. Spatial functions include various intersection routines, conversion from/to barycentric coordinates and bounding box/sphere generators. D3DX is provided as a dynamic link library (DLL). D3DX is deprecated from Windows 8 onward and can't be used in Windows Store apps.[180]
Some features present in previous versions of D3DX were removed in Direct3D 11 and now provided as separate sources:[181]
DXUT (also called the sample framework) is a layer built on top of the Direct3D API. The framework is designed to help the programmer spend less time with mundane tasks, such as creating a window, creating a device, processing Windows messages and handling device events. DXUT have been removed with the Windows SDK 8.0 and now distributed as source via CodePlex.[189]
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.