04. Begin Drawing!

时间:2021-10-10 08:03:40

Programmable Graphics Rendering Pipeline

1. Input Assembler (IA) Stage

2. Vertex Shader (VS) Stage

3. Hull Shader (HS) Stage

4. Tesselator Shader (TS) Stage

5. Domain Shader (DS) Stage

6. Geometry Shader (GS) Stage

7. Stream Output (SO) Stage

8. Rasterizer (RS) Stage

9. Pixel Shader (PS) Stage

10. Output Merger (OM) Stage

04. Begin Drawing!

1 Input Assembler (IA) Stage

IA阶段读取几何数据,定点和索引,在发送数据给IA之前,需要create a buffer and set the Primitive Topology, Input Layout, and active buffers

首先创建两个buffer,Vertex Bufer 和 Index buffer (D3D11_BUFFER_DESC)然后创建 the input-layout object (D3D11_INPUT_ELEMENT_DESC)

1 //The vertex Structure 2 struct Vertex 3 { 4 D3DXVECTOR3 pos; 5 D3DXCOLOR color; 6 }; 7 8 9 //The input-layout description 10 D3D11_INPUT_ELEMENT_DESC layout[] = 11 { 12 {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}, 13 {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0} 14 };

本节的定点类型

struct Vertex //Overloaded Vertex Structure { Vertex(){} Vertex(float x, float y, float z) : pos(x,y,z){} XMFLOAT3 pos; };

本节的input layout

D3D11_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, };

创建inputlayout

ID3D11Device::CreateInputLayout()
创建buffer放我们的物体的极点 (D3D11_BUFFER_DESC)

ID3D11Device::CreateBuffer()

然后,绑定layout和vertext 给IA
ID3D11DeviceContext::IASetVertexBuffers() ID3D11DeviceContext::IASetInputLayout()

然后set the primitive topology 这样IA就知道怎么使用极点了
ID3D11DeviceContext::IASetPrimitiveTopology() 衬着管线筹备好了之后,就可以调draw 把primitives给IA
ID3D11DeviceContext::Draw()

2 Vertex Shader (VS) Stage

VS  是第一个可编程的shader,需本身编写。 每个绘制的极点都将通过VS. 使用VS,您可以执行诸如转换,缩放,照明,纹理的位移贴图等等。

即使措施中的极点不需要改削,极点着色器也必需始终实现管道事情。 流水线中的着色器使用HLSL语言编写,对付本课,我们的极点着色器什么也不做,所以我们只是返回每个极点的位置而不改削它。

float4 VS(float4 inPos : POSITION) : SV_POSITION { return inPos; }

3 Hull Shader (HS) Stage

HS是添加到direct3d 11图形衬着管道的三个新的可选阶段中的第一个。

Hull Shader Stage,Tessellator Stage和Domain Shader Stage三个新阶段配合实现了所谓的tesselation。

tesselation是把一个原始的东西,如一个三角形或线,把它分成许多较小的部分,以增加模型的细节,并且非常快。

它在GPU上创建所有这些新的pirvitives不会被生存到内存中,因此在CPU和内存上创建它们会节省很多时间。 你可以take a simple low  mode,用tesselation使它酿成a very high detailed polly 

回到Hull Shader。 这是另一个可编程的阶段。这个阶段所做的是计算如何以及在哪里向基元添加新的极点以使其越发详细。 然后它将这些数据发送到Tessellator Stage和Domain Shader Stage

4 Tessellator (TS) Stage

TS是一个固定成果阶段。 这个阶段所做的是HS的输入,进行实际的支解。 然后它将数据通报给Domain Shader.。

5 Domain Shader (DS) Stage

DS是tessellation process的第三个阶段, 这是一个可编程的成果阶段。 这个阶段所做的就是从HS阶段获取新极点的位置,