DirectX 11 学习笔记-03

渲染管线概述 

DirectX 11 学习笔记-03

之前已经讲了输入装配阶段(IA),暂时不考虑曲面细分(Tessellator Stage)和几何着色器,则可以简化为 

IA->VS->RS->PS->OM 

顶点着色器 

着色器由HLSL写成。 顶点着色器的主要工作是坐标变换。 

一般空间坐标的变换顺序为Local->World->View->Projection,当没有几何着色器的时候,顶点着色器至少要实现投影变换,因为硬件假定离开顶点着色器后顶点位于投影坐标(无几何着色器时)。当由几何着色器时,投影工作可以在几何着色器中完成。 

像素着色器 

由顶点着色器输出的顶点传入像素着色器前都已经完成了插值处理。像素着色器处理像素片段,它可以简单的输出一个颜色,也可以实现光照、反射和阴影等效果。 

渲染状态 

本质上Direct3D 是一个状态机,在改变它的状态之前,驻留在状态机中的当前状态是不会改变的。渲染管线中除了VS和PS阶段外,还有两个重要阶段RS和OM。我们可以通过配置状态来配置这两个阶段下D3d的行为。 

光栅化阶段 

这一阶段主要任务是为投影后的3D三角形计算像素颜色。几何着色器传出的几何体在进入光栅化阶段前,会先进行裁剪,将超出视锥的部分截取掉。裁剪之后,硬件自动执行透视除法将顶点从齐次裁剪空间变换到规范化设备空间(NDC)。 

顶点进入NDC空间后,需要变换到后台缓冲区中的视口(Viewport)所指定的矩形空间中,变换之后xy将以像素为单位。通常视口变换不修改z坐标,但可以通过D3D11_VIEWPORT 结构体的MinDepth 和MaxDepth 值修改z 坐标的取值范围。 

光栅化阶段还会进行背面消隐。对观察者看不到的三角形面,通过背面消隐剔除它可以提高渲染效率。通过三角形三个顶点的顺序来确定三角形的正面和背面,默认情况下顶点顺序为顺时针的一面为正面。 

顶点属性的插值也是在这一阶段,颜色,法线向量纹理坐标等属性。硬件会自动完成这一功能。 

我们可以修改光栅化阶段的渲染状态,从而修改这个阶段的一些行为。使用RSSetViewports可以设置视口状态,RSSetState传入一个ID3D11RasterizerState可以设置大部分的相关状态。ID3D11RasterizerState对象需要由Device来创建,通过填写D3D11_RASTERIZER_DESC配置状态,并创建ID3D11RasterizerState在需要的时候设置即可。 

输出合并阶段 

像素着色器生成好的像素片段被传入输出合并阶段。这一阶段能完成深度测试/模板测试,丢弃不通过的像素片段。通过的像素片段被写入后台缓冲区,再经过混合从而获得最终颜色。使用OMSetBlendState和OMSetDepthStencilState可以对混合和深度/模板测试进行配置。和配置光栅化阶段类似,状态应该由Device预先创建好,创建时通过Desc结构体来描述状态,在需要变更状态时使用它们。 

Effects 

简单说Effects,它是一系列管线状态的集合,由HLSL和effect框架定义的句法组成。 

除了之前提到的顶点着色器像素着色器,一个effect文件(.fx)中还包含用于存储着色器所需要的变量的常量缓冲。此外,每个effect至少要包含一个technique,每个technique至少要包括一个pass。 

  1. technique11:一个technique由一个或多个pass组成,用于创建一个渲染技术,以实现一种不同的几何渲染方式。使用多个pass渲染被称为多通道技术。 
  2. pass:一个pass有一个顶点着色器,一个可选的几何着色器,一个像素着色器和一些渲染状态组成。 
  3. group:techniques可以组合在一起成为group,group是可选的。有一个全局的未命名的group,那些没有显示定义group的technique会被包含在这个group中,而其他的group必须有名字。group的目的是为了提升性能。 

在写好Effect文件之后,需要编译才能使用。可以离线编译,也可以在程序中通过(D3DX11CompileFromFile)等方法来编译。编译完成后,需要Device来创建Effect。创建好Effect后,可以从中获得techniques以及各种变量的指针,从而能够在C++处更新这些缓冲区的值。设置好常量的值之后,就可以使用techniques来绘制了。 

参考

《Introduction to 3D Game Programming with Directx 11》

Effects (Direct3D 11)