DirectX Rendering Pipeline / DirectX渲染管线

渲染管线就是在给定一个3D场景和摄像机时,根据摄像机的视角生成一幅2D图像的一系列步骤,类似于流水线作业。
一、IA-从内存读取几何数据(顶点和索引)
ID3D10InputLayout 输入布局
1. 创建一个D3D1_INPUT_ELEMENT_DESC结构体
2. 调用CreateInputLayout方法
ID3D10Buffer 缓冲区
1. 创建一个D3D10_BUFFER_DESC结构体,描述要创建的缓冲区
2. 创建一个D3D10_SUBRESOURCE_DATA,指定缓冲区的初始化数据
3. 调用CreateBuffer方法
创建完顶点缓冲区(通过指定bindflag创建不同类型的缓冲区),需要绑定到设备的输入槽上(input slot),这样的话顶点数据就会进入pipeline。 ID3D10Device::IASetVertexBuffers(…)
把顶点缓冲区指定好输入槽只是绘制前的准备工作,需要调用ID3DDevice::Draw方法来进行绘制
图元拓补(Primitive Topology),顶点缓冲区只是一个顶点列表,设备不知道如何解释这些顶点,这就需要设置图元拓补来告诉Device如何解释这些顶点来构成图元,IASetPrimitiveTopology()
typedef enum D3D10_PRIMITIVE_TOPOLOGY
{
D3D10_PRIMITIVE_TOPOLOGY_UNDEFINED = 0,
D3D10_PRIMITIVE_TOPOLOGY_POINTLIST = 1,
D3D10_PRIMITIVE_TOPOLOGY_LINELIST = 2,
D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP = 3,
D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST = 4,  //三角形列表,每三个顶点构成一个三角形
D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP = 5,
D3D10_PRIMITIVE_TOPOLOGY_LINELIST_ADJ = 10,
D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ = 11,
D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ = 12,
D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ = 13,
} D3D10_PRIMITIVE_TOPOLOGY;
 
顶点索引缓冲区,跟创建顶点缓冲区类似,创建好要绑定到pipleline, IASetIndexBuffer,当使用顶点索引绘制时,调用DrawIndexed方法,而不是使用Draw方法
 
二、顶点着色器阶段 Vertex Shader
相当于对每个顶点做一个处理
 
for(UINT i = 0; i < numVertices; ++i)
     outputVertex[i] = VertexShader(inputVertex[i]);
编写好的顶点着色器会在GPU上运行,许多的效果例如变换,光照,置换贴图映射等都是由顶点着色器实现。顶点着色器不仅可以访问输入的顶点数据,还可以访问内存中的纹理和其他数据,例如变换矩阵和场景灯光。
 
局部空间,3D
世界空间,3D
观察空间,视觉空间,摄像机空间都是一个概念,3D
投影空间或者裁剪空间,2D
规范化设备空间(0,1)
 
使用世界变换矩阵将局部空间变换到世界空间 
使用观察变换将世界空间转换到观察空间(View Transform)
在Direct中可以-通过指定摄像机的位置、目标点和世界“向上”向量来创建摄像机坐标系。D3DXMatrixLookAtLH函数可以计算出View Transform Matrix
 
 
投影空间,裁剪空间
 
透视投影矩阵:D3DXMatrixPerspectiveForLH

Leave a Reply

Your email address will not be published. Required fields are marked *