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;

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

索引



根据索引我们可以将顶点按照一定的顺序组装成一个个图形基元,如上图所示。

使用索引占用的内存小,并且可以利用重复的顶点数据,大大降低了内存的使用,提高效率

顶点着色器阶段

在硬件中顶点着色器执行的工作可用如下的伪代码表示:



顶点着色器 可对顶点的位置进行空间变换,也可以实现其它的特效

本章只讨论了空间变换

局部空间到世界空间

每个物体对应一个局部坐标系

当我们需要在不同的场景下绘制物体 或者在一个场景多次以不同的方式绘制同一个物体

这样我们就可以使用不同的世界矩阵来将变换物体

世界空间到观察空间

观察空间 也就是摄像机对应的视椎体 从世界空间转换到观察空间 我们需要对坐标轴进行变换:



我们需要利用摄像机的朝向得到w向量

利用世界坐标系向上的向量j 叉积得到 u向量

最后再 w 与 u的叉积得到v向量 从而得到变换矩阵

d3d中也为我们完成了上述矩阵的推导函数:

观察空间到裁剪空间

在观察空间中 我们需要进行投影 将3d转换为2d

我们假设视椎体的垂直视场角\(\alpha\) 纵横比r 以及近平面n 与远平面f

更进一步地 我们假设投影平面的高为2 这样宽就为2r



利用相似关系 我们可以得到x y 的变换 同时我们也要保留z坐标 用于深度的判断

由于我们还需要对z坐标进行归一化 所以我们在对xy进行变换的同时 需要保留z坐标的值 我们可以使用第四维w来保存z

这样我们分析得到的初始矩阵如下:



在d3d中,我们需要将z坐标投影到0--1的范围 在opengl中则是-1----1,所以我们可以得到两个等式来求出上图中未求出的A 与 B:





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

所以我们要尽可能的让近平面与远平面相差较大

裁剪空间到NDC空间

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

曲面细分阶段

曲面细分是在渲染过程中可选的一阶段

它会将mesh中的三角形进行细分,增加三角形的数量,同时让三角形的位置适当偏移,呈现出更多的细节。

为什么要使用曲面细分?

首先,我们可以让近处的三角形,也就是离摄像机更近的三角形得到更加丰富的细节,而远处的三角形看不清则不做更改。

其次,我们在内存中只维护三角形数量较少的low-poly低模网格,再根据需求为其添加三角形,这样可以节省内存资源

最后,我们在进行动画与物理模拟时,使用低模网格,在进行渲染时采用高模网格。

在d3d11之前,曲面细分是在cpu端进行的,再将新的三角形上传给gpu,而现在已经提供了一组api,可以在gpu端直接实现曲面细分。

几何着色器阶段

几何着色器也是一个可选渲染阶段

它的输入是一个基本图元,输出是将该图元拓展为其它多个图元,或者销毁图元,主要起到销毁或者创建几何体的作用

光栅化阶段

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

视口变换

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

背面剔除



观察上述两个三角形

如果我们假设三角形三个顶点的顺序是v0,v1,v2 计算:

e1 = v1 - v0

e2 = v2 - v0

这两个向量的叉积 如果是如上图左边那个三角形向外的 我们就认为是正面朝向 反之右边则是背面朝向

而正面朝向的三角形会遮挡住背面朝向的三角形



上图是2d情形下的遮挡 从观察点看向该对象 背面朝向的三角形不可见



上图是3d情形下的遮挡 左边是完全透视情况下 右边是实体模式 正面三个面把背面三个面挡住了

顶点属性插值

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

像素着色器阶段

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

输出合并阶段

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

d3d12龙书阅读----d3d渲染流水线的更多相关文章

  1. DX12龙书第6章习题

    1. { { , DXGI_FORMAT_R32G32B32_FLOAT, , , D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, }, { , DXGI_FO ...

  2. Directx11学习笔记【八】 龙书D3DApp的实现

    原文:Directx11学习笔记[八] 龙书D3DApp的实现 directx11龙书中的初始化程序D3DApp跟我们上次写的初始化程序大体一致,只是包含了计时器的内容,而且使用了深度模板缓冲. D3 ...

  3. 开发微信小程序——古龙小说阅读器

    概述 由于面试的关系接触了一下微信小程序,花了2晚上开发了一个带书签功能的古龙小说阅读器,并且已经提交审核等待发布.这篇博文记录了我的开发过程和对微信小程序的看法,供以后开发时参考,相信对其他人也有用 ...

  4. Unity 渲染流水线 :CPU与GPU合作创造的艺术wfd

    前言 对于Unity渲染流程的理解可以帮助我们更好对Unity场景进行性能消耗的分析,进而更好的提升场景渲染的效率,最后提升游戏整体的性能表现 Unity的游戏画面的最终的呈现是由CPU与GPU相互配 ...

  5. 龙书(Dragon book) +鲸书(Whale book)+虎书(Tiger book)

    1.龙书(Dragon book)书名是Compilers: Principles,Techniques,and Tools作者是:Alfred V.Aho,Ravi Sethi,Jeffrey D. ...

  6. 使用D3D渲染YUV视频数据

    源代码下载 在PC机上,对于YUV格式的视频如YV12,YUY2等的显示方法,一般是采用DIRECTDRAW,使用显卡的OVERLAY表面显示.OVERLAY技术主要是为了解决在PC上播放VCD而在显 ...

  7. 正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——3 计算4个函数

    整个引擎代码在github上,地址为:https://github.com/sun2043430/RegularExpression_Engine.git nullable, firstpos, la ...

  8. 移动端 像素渲染流水线与GPU Hack

    什么是 像素渲染流水线 web页面你所写的页面代码是如何被转换成屏幕上显示的像素的.这个转换过程可以归纳为这样的一个流水线,包含五个关键步骤: 1.JavaScript:一般来说,我们会使用JavaS ...

  9. Shader 入门笔记(二) CPU和GPU之间的通信,渲染流水线

    渲染流水线 1)应用阶段(CPU处理) 首先,准备好场景数据(摄像机位置,视锥体,模型和光源等) 接着,做粗粒度剔除工作. 最后,设置好每个模型的渲染状态(使用的材质,纹理,shader等) 这一阶段 ...

  10. 编译原理 #03# 龙书中缀转后缀JS实现版

    // 来自龙书第2章2.5小节-简单表达式的翻译器 笔记 既然是语法制导翻译(Syntax-directed translation),那么最重要的东西当然是描述该语言语法的文法,以下为中缀表达式文法 ...

随机推荐

  1. 域名解析迟迟不生效,刷新本地DNS的方法

    ipconfig /flushdns 刷新后,再ping  发生域名解析 的指向就对了.!

  2. Hadoop的stop-all无法关闭集群原因及解决方案

    问题现象:在服务器上长时间运行hadoop之后,如果运行stop-all.sh,会发现: [root@node1 sbin]# stop-all.shThis script is Deprecated ...

  3. Hive3.1.2安装部署

    一.安装Hive3.1.2 备注:在安装Hive3.1.2之前,请首先安装Hadoop3.1.3. 1. 下载并解压Hive安装包 tar -zxvf ./apache-hive-3.1.2-bin. ...

  4. AT_arc125_c [ARC125C] LIS to Original Sequence 题解

    题目传送门 前置知识 贪心 | 构造 解法 对于任意一个未加入序列 \(P\) 的数 \(x<A_{i}(1 \le i \le k-1)\),如果其放在了 \(A_{i}\) 的前面,会导致最 ...

  5. Nginx实战-公网LB限流配置等

    前提: Nginx要实现根据ip地址进行限流与不限流的区分需要通过源码包安装GeoIP模块 找到与yum安装版本相同的源码包,通过configure进行安装 ./configure --prefix= ...

  6. 【Unity3D】阴影原理及应用

    1 阴影原理 ​ 光源照射到不透明物体上,会向该物体的后面投射阴影,如果阴影区域存在其他物体,这些物体不被光源照射的部分就需要渲染阴影.因此,我们可以将阴影的生成抽象出 2 个流程:物体投射阴影.物体 ...

  7. Spring Boot图书管理系统项目实战-8.续借图书

    导航: pre:  7.借阅图书 next:9.归还图书 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.页面设计 2.1 bookReBorr ...

  8. pta-神坛

    [神坛]pta *相邻两条边围成的三角形面积会是最小的 极角排序+叉积计算三角形面积 #include<bits/stdc++.h> #define int long long using ...

  9. 揭秘一线大厂Redis面试高频考点(3万字长文、吐血整理)

    ## # 3万+长文揭秘一线大厂Redis面试高频考点,整理不易,求一键三连:点赞.分享.收藏 本文,已收录于,我的技术网站 aijiangsir.com,有大厂完整面经,工作技术,架构师成长之路,等 ...

  10. 使用SecScanC2构建P2P去中心化网络实现反溯源

    个人博客: xzajyjs.cn 前言 这款工具是为了帮助安全研究人员在渗透测试过程中防止扫描被封禁.保护自己免溯源的一种新思路.其利用到了区块链中的p2p点对点去中心化技术构建以来构建代理池. 工具 ...