[C++]学习《DirectX12 3D 游戏开发实战》 第七天 利用 Direct3D 绘制几何体

在本章中,我们将关注配置渲染流水线的 Direct3D API 接口与方法、定义顶点着色器和像素着色器并将几何体提交至渲染流水线进行绘制。完成本章的学习后,能以实体着色 (solid coloring) 模式或在线框模式 (wireframe mode) 下绘制 3D 立方体。

目标

1. 探索用于定义、存储和绘制几何体数据的 Direct3D 接口与方法。

2. 学习编写简单的顶点着色器和像素着色器。

3. 了解如何用渲染流水线状态对象来配置渲染流水线。

4. 理解怎样创建常量缓冲区数据,并将其绑定到渲染流水线上。掌握跟签名的用法。

内容整理

1. 顶点与输入布局

利用 Direct3D 绘制几何体—1.顶点与输入布局-CSDN博客

2. 顶点缓冲区

利用 Direct3D 绘制几何体—2.顶点缓冲区-CSDN博客

3. 索引和索引缓冲区

利用 Direct3D 绘制几何体—3.索引和索引缓冲区-CSDN博客

4. 顶点着色器示例

利用 Direct3D 绘制几何体—4.顶点着色器示例-CSDN博客

5. 像素着色器示例

利用 Direct3D 绘制几何体—5. 像素着色器示例-CSDN博客

6. 创建常量缓冲区

7. 编译着色器

8. 光栅器状态

9. 流水线状态对象

10. 几何图形辅助结构体

11. 立方体演示程序

小结

1.除了空间位置信息,Direct3D 中的顶点还可以存储其他类型的属性数据。为了创建自定义的顶点格式,我们首先要将选定的顶点数据定义为一个结构体。待顶点结构体定义好后,便可用输入布局描述 (D3D12_INPUT_LAYOUT_DESC) 向 Direct3D 提供其细节。输入布局描述两部分组成:一个 D3D12_INPUT_ELEMENT_DESC 元素构成的数组,一个记录该数组中元素个数的无符号整数。D3D12_INPUT_ELEMENT_DESC 数组中的元素要与顶点结构体中的成员一一对应。事实上,输入布局描述为结构体 D3D12_GRAPHICS_PIPELINE_STATE_DESC 中的一个字段,这就是说,它实为 PSO (流水线状态对象) 的一个组成部分,用于与顶点着色器输入签名进行格式的比对验证。因此,当 PSO 与渲染流水线绑定时,输入布局也将以 PSO 组成元素的身份随 PSO 与渲染流水线的 IA (输入装配器阶段) 阶段相绑定。

2.为了使 GPU 可以访问顶点/索引数组,便需要将其置于一种名为缓冲区 (buffer) 的资源之内。顶点数据与索引数据的缓冲区分别称为顶点缓冲区 (vertex buffer) 和索引缓冲区 (index buffer)。缓冲区用接口 ID3D12Resource 表示,要创建缓冲区资源需要填写 D3D12_RESOURCE_DESC 结构体,再调用 ID3D12Device::CreateCommittedResource 方法。顶点缓冲区的视图与索引缓冲区的视图分别用 D3D12_VERTEX_BUFFER_VIEW 与 D3D12_INDEX_BUFFER_VIEW 结构体加以描述。随后,即可通过 ID3D12GraphicsCommandList::IASetVertexBuffers 方法与ID3D12GraphicsCommandList::IASetIndexBuffer 方法分别将顶点缓冲区与索引缓冲区绑定到渲染流水线的 IA 阶段。最后,要绘制非索引 (non-indexed) 描述的几何体(即以顶点数据来绘制的几何体)可借助 ID3D12GraphicsCommandList::DrawInstanced 方法,而以索引描述的几何体可由ID3D12GraphicsCommandList::DrawIndexedInstanced 方法进行绘制。

3.顶点着色器是一种用 HLSL 编写并在 GPU 上运行的程序,它以单个顶点作为输入与输出。每个待绘制的顶点都要流经顶点着色器阶段。这使得程序员能够在此以顶点为基本单位进行处理,继而获取多种多样的渲染效果。从顶点着色器输出的数据将传至渲染流水线的下一个阶段。

4.常量缓冲区是一种 GPU 资源 (ID3D12Resource),其数据内容可供着色器程序引用。它们被创建在上传堆 (upload heap) 而非默认堆 (default heap) 中。因此,应用程序可通过将数据从系统内存复制到显存中来更新常量缓冲区。如此一来,C++ 应用程序就可与着色器通信,并更新常量缓冲区内着色器所需的数据。例如,C++程序可以借助这种方式对着色器所用的“世界-观察-投影”矩阵进行更改。在此,我们建议读者考量数据更新的频繁程度,以此为依据来创建不同的常量缓冲区。效率乃是划分常量缓冲区的动机。在对一个常量缓冲区进行更新的时候,其中的所有变量都会随之更新,正所谓牵一发而动全身。因此,应根据更新频率将数据有效地组织为不同的常量缓冲区,以此来避免无谓的冗余的更新,从而提高效率。

5.像素着色器是一种用 HLSL 编写且运行在 GPU 上的程序,它以经过插值计算所得到的顶点数据作为输入,待处理后,再输出与之对应的一种颜色值。由于硬件优化的原因,某些像素片段可能还未到像素着色器就已被渲染流水线剔除了(例如采用了提前深度剔除技术,early-z rejection)。像素着色器可使程序员以像素为基本单位进行处理,从而获得变化万千的渲染效果。从像素着色器输出的数据将被移交至渲染流水线的下一个阶段。

6.大多数控制图形流水线状态的 Direct3D 对象都被指定到了一种称作流水线状态对象 (pipeline state object,PSO) 的集合之中,并用 ID3D12PipelineState 接口来表示。我们将这些对象集总起来再统一对渲染流水线进行设置,是出于对性能因素的考虑。这样一来,Direct3D 就能验证所有的状态是否彼此兼容,而驱动程序也将可以提前生成硬件本地指令及其状态。

  • 29
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值