当前位置: 首页 > article >正文

利用 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 的其他几种工具类中。


http://www.kler.cn/a/378099.html

相关文章:

  • 240. 搜索二维矩阵||
  • 图论——最小生成树的扩展应用
  • 【已解决】黑马点评项目Redis版本替换过程的数据迁移
  • vue和reacts数据响应式的差异
  • Ansible自动化运维实战--通过role远程部署nginx并配置(8/8)
  • 周末总结(2024/01/25)
  • 刘艳兵-DBA021-升级到Oracle Database 12c时,关于使用Export/Import方法迁移数据的说法是正确的?
  • 第三次RHCSA作业
  • 【vue】11.Vue 3生命周期钩子在实践中的具体应用
  • 《JVM第1课》Java 跨平台原理
  • qt QScrollArea详解
  • Git 的特殊配置文件
  • FPGA实现串口升级及MultiBoot(十一)QuickBoot介绍
  • ‌MySQL中‌between and的基本用法‌、范围查询
  • 干货|前端项目一些响应式布局问题(固定宽度仍可以实现响应式)
  • CTF-pwn:libc2.27指针劫持[gyctf_2020_signin]
  • 通过不当变更导致 PostgreSQL 翻车的案例分析与防范
  • WeakReference与SoftReference以及结合ReferenceQueue实践整理
  • AppInventor2能否用网络摄像头画面作为屏幕的背景?
  • Golang--函数、包、defer、系统函数、内置函数
  • thinkphp8模型中 where数组条件大于,小于,like等条件时与tp5/6 的区别和使用示例
  • 3.3_JavaScript 对象与事件
  • 湖南(市场研究)源点咨询 市场调研公司与咨询公司有何不同?
  • Leetcode 腐烂的橘子
  • docker理论+部署(一)
  • masm汇编debug调试字符串大小写转换演示