利用 Direct3D 绘制几何体—8.光栅器状态
当今渲染流水线中的大多阶段都是可编程的,但是有些特定环节却只能接受配置。例如,用于配置渲染流水线中光栅化阶段的光栅器状态(rasterizer state)组由结构体 D3D12_RASTERIZER_DESC 来表示:
typedef struct D3D12_RASTERIZER_DESC {
D3D12_FILL_MODE FillMode; // 默认值为: D3D12_FILL_MODE_SOLID
D3D12_CULL_MODE CullMode; // 默认值为: D3D12_CULL_MODE_BACK
BOOL FrontCounterClockwise; // 默认值为: false
INT DepthBias; // 默认值为: 0
FLOAT DepthBiasClamp; // 默认值为: 0.0f
FLOAT SlopeScaledDepthBias; // 默认值为: 0.0f
BOOL DepthClipEnable; // 默认值为: true
BOOL MultisampleEnable; // 默认值为: false
BOOL AntialiasedLineEnable; // 默认值为: false
UINT ForcedSampleCount; // 默认值为: 0
// 默认值为: D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF
D3D12_CONSERVATIVE_RASTERIZATION_MODE ConservativeRaster;
} D3D12_RASTERIZER_DESC;
其中大部分成员相对高级或不常使用。关键的 3 个成员:
1. FillMode:将此参数设置为 D3D12_FILL_MODE_WIREFRAME 是采用线框模式进行渲染,而设置为 D3D12_FILL_MODE_SOLID 则是使用实体模式进行渲染。默认设置为实体渲染模式。
2. CullMode:指定 D3D12_CULL_MODE_NONE 是禁用剔除操作,D3D12_CULL_MODE_BACK 是剔除背面朝向的三角形,而 D3D12_CULL_MODE_FRONT 是剔除正面朝向的三角形。默认配置为剔除背面朝向的三角形。
3. FrontCounterClockwise:如果指定为 false,则根据摄像机的观察视角,将顶点顺序为顺时针方向的三角形看作正面朝向,而把逆时针绕序的三角形当作背面朝向。相反,如果指定为 true,则根据摄像机的观察视角,将顶点顺序为逆时针方向的三角形看作正面朝向,而把顺时针绕序的三角形当作背面朝向。此参数默认值为 false。
下列代码展示了如何创建一个开启线框模式,且禁用背面剔除的光栅化状态:
CD3DX12_RASTERIZER_DESC rsDesc(D3D12_DEFAULT);
rsDesc.FillMode = D3D12_FILL_MODE_WIREFRAME;
rsDesc.CullMode = D3D12_CULL_MODE_NONE;
CD3DX12_RASTERIZER_DESC 是在扩展自 D3D12_RASTERIZER_DESC 结构体的基础上,又添加了一些辅助构造函数的工具类。其中有一个以接收 CD3DX12_DEFAULT 作为参数来创建光栅化状态对象的构造函数,其实 CD3DX12_DEFAULT 只是一个哑类型(dummy),而此函数的作用是将光栅化状态中需要被初始化的成员重载为默认值。CD3DX12_DEFAULT 和 D3D12_DEFAULT 的定义如下:
struct CD3DX12_DEFAULT {};
extern const DECLSPEC_SELECTANY CD3DX12_DEFAULT D3D12_DEFAULT;
另外,D3D12_DEFAULT(CD3DX12_DEFAULT) 还被广泛地用于 Direct3D 的其他几种工具类中。