d3d12龙书阅读----d3d渲染流水线
  Ly5WKgqR6znz 2024年03月16日 26 0

d3d12龙书阅读----d3d渲染流水线

输入装配器阶段

在输入装配器阶段,会从显存中读取顶点与索引这种几何数据,然后根据图形基元的类型,根据索引将顶点组装起来。

d3d中的图形基元

我们来看看几种常见的图形基元类型:

typedef 
enum D3D12_PRIMITIVE_TOPOLOGY_TYPE
    {
        D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED	= 0,
        D3D12_PRIMITIVE_TOPOLOGY_TYPE_POINT	= 1,
        D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE	= 2,
        D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE	= 3,
        D3D12_PRIMITIVE_TOPOLOGY_TYPE_PATCH	= 4
    } 	D3D12_PRIMITIVE_TOPOLOGY_TYPE;

我们可以看到可以把图形基元设置为未定义、点、线、三角形与控制点

索引

img
根据索引我们可以将顶点按照一定的顺序组装成一个个图形基元,如上图所示。
使用索引占用的内存小,并且可以利用重复的顶点数据,大大降低了内存的使用,提高效率

顶点着色器阶段

在硬件中顶点着色器执行的工作可用如下的伪代码表示:
img
顶点着色器 可对顶点的位置进行空间变换,也可以实现其它的特效
本章只讨论了空间变换

局部空间到世界空间

每个物体对应一个局部坐标系
当我们需要在不同的场景下绘制物体 或者在一个场景多次以不同的方式绘制同一个物体
这样我们就可以使用不同的世界矩阵来将变换物体

世界空间到观察空间

观察空间 也就是摄像机对应的视椎体 从世界空间转换到观察空间 我们需要对坐标轴进行变换:
img
我们需要利用摄像机的朝向得到w向量
利用世界坐标系向上的向量j 叉积得到 u向量
最后再 w 与 u的叉积得到v向量 从而得到变换矩阵
d3d中也为我们完成了上述矩阵的推导函数:
img

观察空间到裁剪空间

在观察空间中 我们需要进行投影 将3d转换为2d
我们假设视椎体的垂直视场角\(\alpha\) 纵横比r 以及近平面n 与远平面f
更进一步地 我们假设投影平面的高为2 这样宽就为2r
img
利用相似关系 我们可以得到x y 的变换 同时我们也要保留z坐标 用于深度的判断
由于我们还需要对z坐标进行归一化 所以我们在对xy进行变换的同时 需要保留z坐标的值 我们可以使用第四维w来保存z
这样我们分析得到的初始矩阵如下:
img
在d3d中,我们需要将z坐标投影到0--1的范围 在opengl中则是-1----1,所以我们可以得到两个等式来求出上图中未求出的A 与 B:
img
img
img

我们还可以对z的这种非线性变换作分析 画出图像可知 绝大多数的深度值都被映射到较小的区域 这可能会对深度缓冲区的精度要求过高 导致无法区分两个深度值
所以我们要尽可能的让近平面与远平面相差较大
img

裁剪空间到NDC空间

在裁剪空间完成 裁剪之后 我们进行透视除法 除以深度值 即进入NDC空间
img

曲面细分阶段

曲面细分是在渲染过程中可选的一阶段
它会将mesh中的三角形进行细分,增加三角形的数量,同时让三角形的位置适当偏移,呈现出更多的细节。
为什么要使用曲面细分?
首先,我们可以让近处的三角形,也就是离摄像机更近的三角形得到更加丰富的细节,而远处的三角形看不清则不做更改。
其次,我们在内存中只维护三角形数量较少的low-poly低模网格,再根据需求为其添加三角形,这样可以节省内存资源
最后,我们在进行动画与物理模拟时,使用低模网格,在进行渲染时采用高模网格。
在d3d11之前,曲面细分是在cpu端进行的,再将新的三角形上传给gpu,而现在已经提供了一组api,可以在gpu端直接实现曲面细分。

几何着色器阶段

几何着色器也是一个可选渲染阶段
它的输入是一个基本图元,输出是将该图元拓展为其它多个图元,或者销毁图元,主要起到销毁或者创建几何体的作用

光栅化阶段

光栅化的主要目的是为投影到屏幕上三角形计算出对应的像素颜色

视口变换

从NDC空间到屏幕空间 将xy转换为以像素为单位

背面剔除

img
观察上述两个三角形
如果我们假设三角形三个顶点的顺序是v0,v1,v2 计算:
e1 = v1 - v0
e2 = v2 - v0
这两个向量的叉积 如果是如上图左边那个三角形向外的 我们就认为是正面朝向 反之右边则是背面朝向
而正面朝向的三角形会遮挡住背面朝向的三角形
img
上图是2d情形下的遮挡 从观察点看向该对象 背面朝向的三角形不可见
img
上图是3d情形下的遮挡 左边是完全透视情况下 右边是实体模式 正面三个面把背面三个面挡住了

顶点属性插值

利用透视校正插值 利用三角形三个顶点的属性 插值得到内部像素的属性

像素着色器阶段

像素着色器 是对输入的每个像素 根据顶点属性插值 计算出像素颜色 同时也能实现反射 阴影等更复杂的效果

输出合并阶段

在输出合并阶段 一些像素可能会被丢弃 比如未通过深度测试或者模版测试 然后剩下的像素会被写入后台缓冲区 在此过程中可能会经过blend操作

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年03月16日 0

暂无评论

推荐阅读
  oXKBKZoQY2lx   2024年03月19日   36   0   0 游戏开发
  oXKBKZoQY2lx   2024年03月23日   43   0   0 游戏开发
  1wMBnbixARwC   2024年03月01日   41   0   0 游戏开发
  1wMBnbixARwC   2024年03月09日   60   0   0 游戏开发
  1wMBnbixARwC   2024年03月06日   25   0   0 游戏开发
  398vzLiyyaJn   2024年03月13日   27   0   0 游戏开发
Ly5WKgqR6znz