DirectX11 Tutorial
Preface
1. Win32 框架
graph LR
A(WindowClass)-->B(Window)
B-->C(ShowWindow)
C-->D(MainLoop)
一般的主循环和消息机制挂钩,每次进入循环时先处理Windows系统消息,再做引擎相关的更新。而对Windows系统消息的利用要尽可能低,仅处理少量必要的窗口消息(菜单,新建/关闭窗口),其它需要处理的消息如用户键盘输入则交给上层引擎做。如非必要,尽量将Windows那一套东西仅用于提供引擎输出画面的窗口。
2. DirectX 11 绘制
上下文信息
- IDXGISwapChain:颜色缓存,和创建的HWND对象绑定来显示。
- ID3D11Device:提供显示设备相关的接口,用于创建各种资源。线程安全,可以多个线程同时访问。
- ID3D11DeviceContext:设备上下文,维护流水线状态。非线程安全,多线程访问需要进行线程同步。
DirectX 11 流水线
graph TD
subgraph FULL
A[InputAssembler]-->B(VertexShader)
B-->C(HullShader)
C-->D[Tesselator]
C-->E(DomainShader)
D-->E
E-->F(GeometryShader)
F-->G[Rasterizer]
F-->H[StreamOutput]
G-->I(PixelShader)
I-->J[OutputMerger]
style A fill:#F596AA;
style B fill:#F596AA;
style C fill:#F596AA;
style E fill:#F596AA;
style F fill:#F596AA;
style H fill:#66BAB7;
style I fill:#58B2DC;
style J fill:#58B2DC;
end
subgraph SIMPLE
K[InputAssembler]-->L(VertexShader)
L-->M[Rasterizer]
M-->N(PixelShader)
N-->O[OutputMerger]
style K fill:#F596AA;
style L fill:#F596AA;
style N fill:#58B2DC;
style O fill:#58B2DC;
end
色表示可读取Memory
色表示可写入Memory
色表示可读写Memory
InputAssembler Stage
- ID3D11Buffer(VertexBuffer,VB):存储顶点数据,作为VertexShader(VS)的输入。
- ID3D11Buffer(IndexBuffer,IB):存储顶点索引数据,描述顶点绘制顺序。
- D3D_PRIMITIVE_TOPOLOGY:描述图元拓朴结构。
- ID3D11InputLayout:存储顶点格式,VS根据该格式解析VB的数据。
由于InputLayout里定义的语义等信息直接对应VS的输入,因而创建时要提供VS的字节码。
Rasterizer Stage
- ID3D11RasterizerState:设置光栅化状态。
OutputMerger Stage
- ID3D11RenderTargetView(RTV):流水线输出缓存,可以绑定任意ID3D11Resource对象。
- ID3D11DepthStencilView(DSV):深度模板缓存。
- ID3D11DepthStencilState(DSS):设置模板测试和深度测试状态。
- ID3D11BlendState:设置混合状态,每个RTV单独设置。
XXXShader Stage
- ID3D11Buffer(ConstBuffer,CB):存储非格式化常量数据。
- ID3D11ShaderResourceView(SRV):存储格式化的常量数据。
- ID3D11SamplerState:采样器,描述如何读SRV中的数据。
- ID3D11XXXShader:着色器。
3. DirectX 11 初始化
首先是设备与上下文,主要通过以下接口实现:
- D3D11CreateDevice+IDXGIFactory::CreateSwapChain
- D3D11CreateDeviceAndSwapChain