• DirectX12龙书--第五章笔记


    需要龙书电子版的可联系我,部分图片太大,csdn导入不了,可访问我的github图床github或者在书里面查看。

    第五章

    渲染流水线

    渲染流水线,也称渲染管道、渲染管线、绘制流水线、图形流水线

    5.1 3D视觉即错觉?

    5.2 模型的表示

    实体3D对象是借助三角形网络来近似表示的,因此我们要以三角形作为3D物体建模的基石。通常所用三角形越多,模型就与目标物体越接近

    5.3 计算机色彩基础

    计算机显示器中的每个像素发出的都是红绿蓝三色混合光。光线照射到视网膜上,视锥细胞收到刺激产生神经冲动,并通过视神经传导大脑,大脑接受信号并感知颜色。通常使用归一化来表示光强,0无强度,1最强,通常用3D向量来表示。

    5.3.1 颜色运算

    可以使用3D向量的运算来计算不同光的混合得到的新的光,相加、相减、标量乘法。但是点积和叉积不适用。

    颜色向量有专属的颜色运算,分量式。定义:

    image-20220620161811716

    K为常数,一般用于光照方程中,Kr, Kg Kb分别为某表面对三色光不同的反射或吸收率,这样可计算出反射光的颜色。

    在颜色计算时,当颜色光强分量超过了0~1,由于我们使用了归一化表示,就要进行clamp,即大于1,就表示为1,小于0,就表示为0。

    5.3.2 128位颜色

    颜色表示通常还有一个分量,alpha分量,用来表示颜色的不透明度,0表示透明,1表示不透明。此时就要使用4D分量来表示颜色。DirectXMath库表示分量式计算的函数为XMColorModulate();

    5.3.3 32位颜色

    32bit表示,每个分量只有一个字节的空间,可以储存256种颜色强度。但是四个分量组合起来可以表示256* 256* 256=16777216种颜色,DirectXMath用如下结构来存储32位颜色

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KnIH7dRi-1656121803468)(https://raw.githubusercontent.com/tiger-liujianhua/blog-img-for-github/main/202206221714304.png)]

    32bit表示和128bit表示可以相互转换,32转换位128只需要对每个分量除以255,128转换为32反之,用乘。注意,XMCOLOR通常把32bit的颜色表示形式储存为32bit的整数值,所以在使用时需要转换,使用函数XMLoadColor();反向转换使用函数XMStoreColor();

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MGLcTZBD-1656121803468)(https://raw.githubusercontent.com/tiger-liujianhua/blog-img-for-github/main/202206221714305.png)]

    5.4 渲染流水线概述

    image-20220620165111829

    5.5 输入装配器阶段

    输入装配器阶段会从显存中读取几何数据(顶点和索引),然后把他们装配为图元,例如三角形、线条等。就是通过索引来定义如何将顶点装配到一起构成图元的办法。

    5.5.1 顶点

    在DirectX3D中,顶点不只是空间或平面上的一个点,而且也会包含其他信息。

    5.5.2 图元拓扑

    DirectX3D中使用顶点缓冲区来将顶点与渲染流水线相绑定。顶点缓冲区利用连续内存来储存顶点。而图元拓扑的作用就是告知DirectX2D如何使用这些顶点,是表示线,还是表示三角形。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UEacIPnt-1656121803469)(https://raw.githubusercontent.com/tiger-liujianhua/blog-img-for-github/main/202206221714307.png)]

    5.5.2.1 点列表

    D3D——PRIMITIVE_TOPOLOGY_POINTLIST,使用此枚举项时,所有顶点都会被绘制为单独的点

    5.5.2.2 线条带

    D3D——PRIMITIVE_TOPOLOGY_LINESTRIP,顶点会被绘制成一系列连续线段,N+1个顶点会有N条线段

    5.5.2.3 线列表

    D3D——PRIMITIVE_TOPOLOGY_LINELIST,顶点被绘制为单独的线段,2N个顶点会生成N条线段,线列表里的线段可以分开,相互是独立的,线条带中的线段是相连的。

    5.5.2.4 三角形带

    D3D——PRIMITIVE_TOPOLOGY_TRIANGLESTRIP,顶点被绘制成相互连接的三角形,一个顶点可以被多个三角形共同使用,N个顶点可以生成N-2个三角形。此处注意,三角形的绘制顺序是不一样的次序为奇数的三角形和次序为偶数的三角形的绕序不一样(顺时针逆时针),这是剔除问题的由来,解决这个问题,DirectX会置换偶数三角形的后两个顶点顺序。

    5.5.2.5 三角形列表

    D3D——PRIMITIVE_TOPOLOGY_TRIANGLELIST,顶点被绘制成单独的三角形,3N个顶点绘制N个三角形

    5.5.2.6 具有邻接数据的图元拓扑

    D3D——PRIMITIVE_TOPOLOGY_TRANGLELIST_ADJ,对邻接数据的操作。例如一个三角形会有三个邻接三角形,在几何着色器中可能会需要这些邻接三角形的数据来实现算法,这个拓扑的作用就是告诉渲染流水线如何使用顶点缓冲区中的数据来绘制主三角形及邻接三角形。注意邻接图元的顶点只用作计算,不会被绘制出来。

    5.5.3 索引

    在绘制的时候,为三角形指定顶点顺序是非常重要的,称这个顺序为绕序。在实际的绘制三角形的过程中,我们通常使用索引机制。先用一个顶点列表收录所有顶点,然后用一个索引列表储存顶点列表的索引值。之后我们要表示一个三角形,只需要用一个三个索引一组的组合表示即可。好处在于,索引只是一组整数,比顶点结构体节约内存,并且图形硬件不需要对相同的顶点重复计算处理,直接从缓存中取用即可。

    5.6 顶点着色器阶段

    顶点着色器就是对顶点进行处理,其输入输出都是顶点。顶点着色器中,不仅可以访问输入的顶点数据,也可以访问纹理和其他存于显存中的数据。

    5.6.1 局部空间和世界空间

    将局部坐标系的坐标转换到全局场景坐标系中的过程交作世界变换,使用的矩阵叫做世界矩阵。

    可定义一系列的变换组合W,W=SRT,S是缩放矩阵,将物体缩放到世界空间;旋转矩阵R定义局部空间相对于世界空间的朝向;平移矩阵T定义局部空间的原点相对于世界空间的位置

    5.6.2 观察空间

    场景中摄像机的局部坐标系被称为观察空间,也叫做观察坐标系,视图空间,摄像机空间等。摄像机位于此坐标系的原点,朝向z轴方向,向上为y轴方向,向右为x轴方向。

    由世界空间至观察空间的坐标变换叫做视图变换,取景变换,矩阵叫做视图矩阵,观察矩阵等。

    image-20220620193636331

    若知道徐阿妮摄像机的位置Q,摄像机对准的观察目标点T,J表示世界空间“向上”的单位向量,即可推导出观察矩阵的各个分量,具体推导看P157,DirectXMath库提供了XMMatrixLookAtLH()函数来处理。

    5.6.3 投影和齐次裁剪空间

    摄像机课观察到的空间是一个四棱锥

    5.6.3.1 定义平截头体

    在观察空间中,可以通过近平面(近裁剪面)n,远平面(远裁剪面)f,垂直视场角α以及纵横比r这四个参数来定义一个平截头体。为了保持图像的原比例,纵横比r应该与后台缓冲区的大小比例相等,不然图像会被拉伸。

    通过垂直视场角α和纵横比r就可以确定水平视场角β

    5.6.3.2 投影顶点

    利用相似三角形就可以求出投影顶点的坐标

    投影公式如下:

    image-20220621145658394

    5.6.3.3 规格化设备坐标

    规格化坐标的目的是去除投影窗口对纵横比的依赖

    5.6.3.4 用矩阵来表示投影公式

    投影公式显然有线性和非线性的部分,即除以Z是非线性的部分,需要在处理完线性的部分后再把结果除以Z,但是此时我们已经没有Z的原始值了。解决办法就是在处理线性部分的时候,把Z保存在处理结果向量里。

    image-20220621150119689

    image-20220621150139093

    非线性部分的计算也叫做透视除法或齐次除法

    5.6.3.5 归一化深度

    上述操作完成后,所以的投影点都会在投影窗口上。此时我们需要对Z进行归一化,但是同时必须保证Z的保序性,因为深度缓冲区会用到不同Z的相对大小。

    通过推导可得出归一化函数为

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aHyhvlRG-1656121803471)(https://raw.githubusercontent.com/tiger-liujianhua/blog-img-for-github/main/202206221714312.png)]

    函数图像如下

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5zGinkuC-1656121803472)(https://raw.githubusercontent.com/tiger-liujianhua/blog-img-for-github/main/202206221714313.png)]

    有函数图像可以看出,大量的Z值归一化之后将会集中在一个小区间内,这会导致精度问题,使后面对Z进行比较的时候产生误差。通过令近平面和远平面尽可能地解决,可以改善这个问题。

    这个时候可以得出完整的透视投影矩阵了:

    image-20220621151836897

    5.6.3.6 XMMatrixPerspectiveFovLH函数

    此函数用于构建透视投影矩阵

    5.7 曲面细分阶段

    曲面细分阶段是利用镶嵌化处理技术对网格中的三角形进行细分,以此来增加物体表面的三角形数量。再将这些三角形偏移到合适的位置,使网格表现出更加细腻的细节。

    5.8 几何着色器阶段

    几何着色器的输入时完整的图元,几何着色器的主要优点是可以创建或销毁几何体。

    5.9 裁剪

    5.10 光栅化阶段

    将投射到屏幕上的三角形所占的像素的颜色计算出来。

    5.10.1 视口变换

    当裁剪完成后,硬件就会通过透视除法将物体从齐次剪裁空间变换为规格化设备坐标。变换完成后这些顶点坐标就会被变换到后台缓冲区中称为视口的矩形里,Z值通常不变。

    5.10.2 背面剔除

    计算三角形法线,正向那个面为正面,另一个是背面。也可以根据顶点绕序来判断,在观察者视角,顺时针为正面朝向,逆时针为背面朝向。背面的三角形是看不到的,即使是处理了,也不会在屏幕上显示出来,所以可以把背面的三角形从渲染流水线中去除,可以大幅减小性能开销,大约能去除一般三角形。

    5.10.3 顶点属性插值

    顶点除了位置信息以外,还能有颜色,法向量等其他属性。

    通过使用透视矫正插值的办法,可以得到屏幕空间中各个顶点的插值属性。

    本质上,插值法就是利用三角形顶点的属性值计算出其内部像素的属性。

    5.11 像素着色器阶段

    对每一个像素进行计算,原理是根据顶点的插值属性作为输入来计算出相应的像素颜色。像素着色器可以返回单一的颜色,也可以返回逐像素光照,反射,阴影等效果

    5.12 输出合并阶段

    像素着色器生成的像素片段会被送到这个阶段,然后将把要显示在屏幕上的像素片段写入到后台缓冲区

    上,插值法就是利用三角形顶点的属性值计算出其内部像素的属性。

    5.11 像素着色器阶段

    对每一个像素进行计算,原理是根据顶点的插值属性作为输入来计算出相应的像素颜色。像素着色器可以返回单一的颜色,也可以返回逐像素光照,反射,阴影等效果

    5.12 输出合并阶段

    像素着色器生成的像素片段会被送到这个阶段,然后将把要显示在屏幕上的像素片段写入到后台缓冲区

  • 相关阅读:
    为什么个人IP对任何行业都至关重要
    pymysql写入时,遇到pandas dataframe中有混合的数据类型以及nan值
    React——ES6语法补充
    Linus:我终于在 M2 芯片的 MacBook 上发布了 Linux 最新版本!
    简易介绍如何使用拼多多商品详情 API。
    AJAX请求及解决跨域问题
    LeetCode(力扣)491. 递增子序列Python
    DSI及DPHY的学习
    C---字符串
    java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
  • 原文地址:https://blog.csdn.net/qq_51599283/article/details/125455752