利用 Direct3D 绘制几何体—8.光栅器状态

当今渲染流水线中的大多阶段都是可编程的,但是有些特定环节却只能接受配置 。例如,用于配置渲染流水线中光栅化阶段的光栅器状态(rasterizer state)组由结构体 D3D12_RASTERIZER_DESC 来表示:

cpp 复制代码
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

下列代码展示了如何创建一个开启线框 模式,且禁用背面剔除的光栅化状态:

cpp 复制代码
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 的定义如下:

cpp 复制代码
struct CD3DX12_DEFAULT {};
extern const DECLSPEC_SELECTANY CD3DX12_DEFAULT D3D12_DEFAULT;

另外,D3D12_DEFAULT(CD3DX12_DEFAULT) 还被广泛地用于 Direct3D 的其他几种工具类中。

相关推荐
Dave.B1 小时前
用【vtk3DLinearGridCrinkleExtractor】快速提取3D网格相交面
算法·3d·vtk
Code Slacker1 小时前
LeetCode Hot100 —— 滑动窗口(面试纯背版)(四)
数据结构·c++·算法·leetcode
hssfscv1 小时前
Javaweb 学习笔记——html+css
前端·笔记·学习
Mr.Jessy1 小时前
JavaScript高级:深浅拷贝、异常处理、防抖及节流
开发语言·前端·javascript·学习
博客胡2 小时前
Python-fastAPI的学习与使用
学习·fastapi·ai编程
HyperAI超神经2 小时前
【Triton 教程】triton_language.load
人工智能·学习·大语言模型·cpu·gpu·编程语言·triton
知识分享小能手2 小时前
Ubuntu入门学习教程,从入门到精通,Linux操作系统概述(1)
linux·学习·ubuntu
SHERlocked933 小时前
摄像头 RTSP 流视频多路实时监控解决方案实践
c++·后端·音视频开发
Dream Algorithm3 小时前
自古英雄多寂寥
笔记
yuhaiqun19893 小时前
Typora 技能进阶:从会写 Markdown 到玩转配置 + 插件高效学习笔记
经验分享·笔记·python·学习·学习方法·ai编程·markdown