DirectX11笔记(四)--渲染管线

2024-05-11 22:58
文章标签 笔记 渲染 管线 directx11

本文主要是介绍DirectX11笔记(四)--渲染管线,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 前言
  • 渲染管线
  • INPUT ASSEMBLER
  • VERTEX SHADER
  • TESSELLATION
  • GEOMETRY SHADER
  • RASTERIZATION
  • PIXEL SHADER
  • OUTPUT MERGER
  • 结语


前言

  在正式开始学习Dx11渲染之前还需要学习一个重要概念—-渲染管线. 渲染管线负责将3D摄像机(相当于人眼)看到的3D场景转换成一张2D图片显示在屏幕上.
  3D->2D
  渲染管线其实就是在做一件事: 3D->2D
  所幸画家们早已将3D的世界画在2D的画卷中, 其中的原理已经被研究的非常透彻, 这些原理我们每日所见, 可能已经简单合理到让人不需要思考的地步, 但是在学习3D渲染的时候还是最好有着明确的认识. 将3D真实的转为2D的关键:

  • 透视与近大远小
  • 遮挡关系
  • 光照
  • 阴影

  正如之前所说, 这些原理实在过于直观和合理, 所以就不多做解释, 这里提及只为明确这些思想.
  关键原理


渲染管线

  接下来正式说明渲染管线. 如下图即为DX11的渲染管线, 从GPU资源指向阶段的线表示该阶段可以将GPU资源作为输入, 从阶段指向内存的线表示这个阶段可以写GPU资源. 从图中可以看出大多数阶段是不会写GPU资源的, 更多的情况是前一阶段的输出会变成下一阶段的输入, 这就是所谓的管线.
  渲染管线


INPUT ASSEMBLER

  IA阶段会读取图形数据(顶点, 索引)并用这些数据生成基本物体(三角, 线等).
  顶点存储着物体的诸多信息(比如位置, 法线, 颜色等等), 将他们按照一定的规则组织便可以形成图形(这个规则被称为Primitive Topology). 由三个点便可以组成一个三角形, 比如为了表示一个八边形, 我们可以使用这样一个顶点的数组:

Vertex octagon[24] = {v0, v1, v2, // Triangle 0v0, v2, v3, // Triangle 1v0, v3, v4, // Triangle 2v0, v4, v5, // Triangle 3v0, v5, v6, // Triangle 4v0, v6, v7, // Triangle 5v0, v7, v8, // Triangle 6v0, v8, v1, // Triangle 7
};

  八边形
  这时我们发现其实一个图形中会有很多的共用顶点, 这些共用顶点会增加内存的开销, 增加图形设备的压力. 使用三角形带可以避免这种情况, 但是更多时候三角形列表是更加灵活的选择. 于是索引的概念被提出. 我们同时创建顶点列表和索引列表, 顶点列表只存储9个顶点, 用索引列表来存储三角形的组织形式. 索引是简单的整型数据, 不会像顶点一样占据很多空间, 另外在良好的缓存下, 硬件重复处理相同顶点的情况也会下降, 所以使用索引这种方式是有效的优化方案.

Vertex v [9] = {v0, v1, v2, v3, v4, v5, v6, v7, v8};
UINT indexList[24] = {0, 1, 2, // Triangle 00, 2, 3, // Triangle 10, 3, 4, // Triangle 20, 4, 5, // Triangle 30, 5, 6, // Triangle 40, 6, 7, // Triangle 50, 7, 8, // Triangle 60, 8, 1, // Triangle 7
};

VERTEX SHADER

  顶点shader可以被看做一个方法, 他接受一个顶点再返回一个顶点, 虽然这个方法是我们编写, 但是他由GPU负责执行, 所以运行非常快. 诸如变换, 光照等很多效果都可以在这时进行计算.
在顶点shader中需要重点关注的是以下几件事:

  1. World Transform: 自身坐标转换到世界坐标. 一个物体在进入渲染管线之前是在他自身坐标系下表示的, 这时通过顶点shader阶段后将会把它转换到世界坐标系中, 这样才能把物体放在场景中正确的位置上.
  2. View Transform: 之前提到会有一个虚拟的摄像机代替人眼来看3D世界, 这个变换便是将经过世界变换的场景转换到摄像机的视角下. 我们把摄像机的位置视为原点, 摄像机观察的方向为z轴的正方向, 摄像机右侧为x轴正方向, 二者确定y轴的正方向(实际计算时会利用上方向和观察方向确定x轴, 然后再确定y轴). 这个坐标系确定了一个名为View Space的空间, View Transform便是从World Space到View Space的变换.
  3. Projection Transform: 这个变换将经过View Transform处理后的世界投影到屏幕上, 他确定了3D物体在屏幕上的位置, 近大远小就是在这时产生的.

  这部分涉及大量变换和矩阵的基础知识, 有不明白的地方还需要及时回顾. 幸运的是Dx11的数学库为我们封装现成的方法, 在学习时可以直接使用. 但是在自己的引擎中还是应该自己实现.
  将这三种变换的矩阵相乘便得到了著名的WVP矩阵.


TESSELLATION

  曲面细分是将一个三角形拆分成多个三角形的技术, 他可以实现诸如LOD等技术. 也可以让程序得以使用低模进行计算, 经过细分之后的”高模”进行渲染, 从而达到节省内存, 降低运算量等目的. 由于DX11之前曲面细分只能在CPU上进行, 这是很影响效率的, 所以这项技术并不流行. DX11新添加的曲面细分阶段提供了在GPU上进行曲面细分的方法, 这将极大地提升这部分的效率. 需要注意的是他并不是渲染管线的一个必须阶段, 所以他会在以后细说.


GEOMETRY SHADER

  这又是一项可选的技术, 他是一种更高层次的技术, 会在以后说明. 他可以为不能创造顶点的Vertex Shader阶段做些事, 比如将一个输入的primitive扩展成多个或者通过某些条件控制某些primitive不输出. 需要注意的是定点的位置必须是经过Vertex Shader处理后再投影空间的位置.


RASTERIZATION

  光栅化其实是一种将几何图元变为二维图像的过程. 该过程包含了两部分的工作:

  1. 决定窗口坐标中的哪些整型栅格区域被基本图元占用.
  2. 通过对顶点属性插值, 分配颜色, 深度等属性到各个区域.

  光栅化就是把顶点数据转换为片元的过程. 片元中的每一个元素对应于帧缓冲区中的一个像素.


PIXEL SHADER

  像素shader和顶点shader一样, 是我们编写的在GPU上执行的函数. 他会对每一个像素进行处理. 比如使用插值之后的顶点数据进行颜色计算. 像素shader可以做很多事情, 在以后我们会逐渐接触到.


OUTPUT MERGER

  经过顶点shader处理之后的数据被送到输出合并阶段, 这个阶段会剔除一些像素(比如未通过深度测试), 剩下的像素会被写入back buffer. 混合(Blend)也发生在这个阶段, 透明效果一般就是通过混合技术实现的.


结语

  以上是对渲染管线的一个简单介绍. 渲染管线是DirectX的重要概念, 他阐明了DX将虚拟的3D世界画在屏幕上呈现在人们眼前的标准流程. DX版本几经更迭也是在不断完善这条管线, 对管线的优化与调整(比如延迟渲染)可以实现更加丰富多彩的效果, 但这也建立在对渲染管线的理解上.
  基础理论务必理解, 更应牢记.

这篇关于DirectX11笔记(四)--渲染管线的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/980897

相关文章

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个

Git 的特点—— Git 学习笔记 02

文章目录 Git 简史Git 的特点直接记录快照,而非差异比较近乎所有操作都是本地执行保证完整性一般只添加数据 参考资料 Git 简史 众所周知,Linux 内核开源项目有着为数众多的参与者。这么多人在世界各地为 Linux 编写代码,那Linux 的代码是如何管理的呢?事实是在 2002 年以前,世界各地的开发者把源代码通过 diff 的方式发给 Linus,然后由 Linus