D3D的历史
几个重点:
- Direct3D(简称D3D)是DirectX的一部分
- D3D和GDI是同层组件
- Direct 3.0被认为是DirectX的第一套完整版本
- Direct3D 6.0,1998年秋微软推出,引进多重贴图(multitxture)以及stencil buffer
- Direct3D 8.0引进了可编程Pipeline
- Direct3D 8.0支援处理顶点的Vertex Shader,以及处理像素的Pixel Shader。使Direct3D的技术正式超越劲敌OpenGL。与DirectDraw编程介面合并并改名为DirectX Graphics。
- Direct3D 9.0使用HLSL编写Vertex Shader和Pixel Shader
- Windows Vista推出DirectX的两种新类型:Direct3D 9Ex和Direct3D 10
DXGI
全称是”Microsoft DirectX Graphics Infrastructure”。
什么时候推出的: 好像win7 sp1就有了, 无从考证。
DXGI是干嘛的:
举个例子,在以前图形子系统都归D3D,结果D3D8/D3D9分别有一套代码用来管理swap chain。在Vista+里,图形API越来越多,D3D9/D3D10/D3D11/D3D12,都来一套swap chain太没意义了。于是重构成所有API可以共享一份swap chain的代码,这就放在DXGI。除此之外,窗口全屏化之类的事情也都归DXGI了,你可以认为屏幕输出的部分都归DXGI。后来DXGI又加了一些底层的功能,用来跟DWM打交道,比如拷贝混合后的屏幕,设备旋转,跨屏幕窗口。。。还有些未公开的,我就不说了。(作者:叛逆者, 链接:https://www.zhihu.com/question/36501678/answer/67786884)
####DxgiFactory
不同windows版本能够创建的DxgiFactory版本不一样:
- DxgiFactory, windows
- DxgiFactory1, Windows 7
- DxgiFactory2, windows 8 或者 win7上天机了win8的update(win7 sp?)
Do not mix the use of DXGI 1.0 (IDXGIFactory) and DXGI 1.1 (IDXGIFactory1) in an application. Use IDXGIFactory or IDXGIFactory1, but not both in an application.
因此, 程序中使用D3D的时候需要确保代码是统一的。比如,使用统一的封装来创建DxgiFactory。
OBS使用CreateDXGIFactory1来创建factory, 然后在这基础上继续往上枚举(需要相关功能的时候)。
WDDM
Direct3D 9Ex和Direct3D 10均构建于WDDM之上,只有透过WDDM才能在Vista上使用Direct3D。
图形硬件供应商必须提供用户模式显示驱动程序和显示微型端口驱动程序 (也称为内核模式显示驱动程序或 KMD) 。
- 用户模式显示驱动程序是 Direct3D 运行时加载 (DLL) 的动态链接库。
- 显示微型端口驱动程序与 DirectX 图形内核子系统通信。
Window模式和Exclusive模式
windowed模式下,必须使用back buffer。在Exclusive模式下,Direct3D直接呼叫显示卡驱动程式,而不通过GDI。