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

这篇具有很好参考价值的文章主要介绍了d3d12龙书阅读----d3d渲染流水线。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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;

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

索引

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

顶点着色器阶段

在硬件中顶点着色器执行的工作可用如下的伪代码表示:
d3d12龙书阅读----d3d渲染流水线
顶点着色器 可对顶点的位置进行空间变换,也可以实现其它的特效
本章只讨论了空间变换

局部空间到世界空间

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

世界空间到观察空间

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

观察空间到裁剪空间

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

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

裁剪空间到NDC空间

在裁剪空间完成 裁剪之后 我们进行透视除法 除以深度值 即进入NDC空间
d3d12龙书阅读----d3d渲染流水线

曲面细分阶段

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

几何着色器阶段

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

光栅化阶段

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

视口变换

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

背面剔除

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

顶点属性插值

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

像素着色器阶段

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

输出合并阶段

在输出合并阶段 一些像素可能会被丢弃 比如未通过深度测试或者模版测试 然后剩下的像素会被写入后台缓冲区 在此过程中可能会经过blend操作文章来源地址https://www.toymoban.com/news/detail-840696.html

到了这里,关于d3d12龙书阅读----d3d渲染流水线的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一、D3D12学习笔记——初始化Direct3D

    工厂类IDXGIFactory4,这个类有两个作用: 1.枚举适配器(显卡); 2.创建交换链 这个类对象的创建如下: 用这个对象mdxgiFactory枚举我们可以使用的显卡等适配器: 对于一个选定的适配器pIAdapter,拿着它去创建设备 IID_PPV_ARGS这个宏实际包含了两个东西,uuid的COM ID和对象的指针

    2024年02月10日
    浏览(35)
  • DirectX12(D3D12)基础教程(二十一)—— PBR:IBL 的数学原理(1/5)

      2023年来了,令人闹心伤身的疫情也暂告一段落了。感慨之余,其实我也挺惆怅,这个系列教程还能继续下去吗?或者我自己还能坚持多久,我不知道。因为我也天天徘徊在失业的边缘,年纪大了被人嫌弃,学历低被人嫌弃,身体稍差也被人嫌弃,忽然发现我已不是当初那

    2023年04月08日
    浏览(44)
  • DirectX12(D3D12)基础教程(二十一)—— PBR:IBL 的数学原理(5/5)镜面反射积分项2及光照合成

    3.5.4、根据 Epic 近似假设进一步拆分积分项为两部分之积   通过之前的步骤,实际上以及得到了我们想要的镜面反射项的蒙特卡洛积分重要性采样的形式,并且根据我们的假设认为视方向等于法线方向,实际上以及可以编码实现这个积分计算过程,而且依据假设我们不再需

    2023年04月08日
    浏览(33)
  • 缺失d3d9.dll怎么办,修复d3d9.dll的方法分享

    当您在 Windows 操作系统中启动某些游戏或应用程序时,您可能会遇到“缺失d3d9.dll”的错误提示。这个问题通常是由于系统缺失了DirectX 9的组件库,从而导致该dll文件无法正常加载。但是,您不需要担心,因为这个问题可以很容易地解决。本文将介绍一些最常见的解决方案,

    2024年02月10日
    浏览(41)
  • 【UE4闪退解决办法】D3D设备丢失,Unreal Engine is exiting due to D3D device being lost

    百度那些被小编到处传的,一般来说都没啥用的。我后来在贴吧老哥的楼里才翻出一个别样的解决方法。 打开英伟达的这个驱动软件,GeForce Experience  进去后,在“驱动程序”里面,点3个点打开列表,选择“studio驱动程序” 然后就是选择自定义安装(不要快速!),之后弹

    2024年02月13日
    浏览(108)
  • 玩游戏缺失“d3d11.dll丢失“的问题的五种解决方案

    在我日常的计算机维护工作中,经常遇到一些用户报告他们遇到了\\\"d3d11.dll丢失\\\"的问题。这是一个常见的Windows系统错误,通常会导致程序无法正常运行。在这篇文章中,我将分享我找到的五种有效的解决方法,以帮助这些用户解决这个问题。 方法一:使用dll修复工具(亲测有

    2024年02月05日
    浏览(48)
  • UE5出现:File:D:\build\++UE5\Sync\Engine\Source\Runtime\Windows\D3D11RHI\Private\D3D11Util.cpp

    UE5项目打包发布后,打到运行报错: The UE5-ArchVizExplorer Game has crashed and will close --------------------------- Fatal error: [File:D:build++UE5SyncEngineSourceRuntimeWindowsD3D11RHIPrivateD3D11Util.cpp] [Line: 259] Direct3DDevice-CreateShaderResourceView failed with error E_INVALIDARG  at D:build++UE5SyncEngineSourceRunt

    2024年02月12日
    浏览(26)
  • 【C/C++】使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小

    目录 一,函数清单 1.Direct3DCreate9 函数 2.IDirect3D9::CreateDevice 方法 3.IDirect3DDevice9::GetDisplayMode 方法 4.IDirect3DDevice9::CreateOffscreenPlainSurface 方法 5.IDirect3DDevice9::GetFrontBufferData 方法 6.IDirect3DDevice9::D3DXLoadSurfaceFromSurface 方法 7. D3DXSaveSurfaceToFile 函数 二,关键代码实现 三,最终实现

    2024年01月18日
    浏览(33)
  • 轻量封装WebGPU渲染系统示例<12>- 基础3D对象实体(源码)

    此混合渲染与计算系统中,用户侧可直接接触和操作可渲染(计算)实体(Entity)。这些实体可以用于呈现画面效果也可以仅用于计算。实体可以加入场景,可以加入渲染核心,也可以加入计算核心。如果使用rendering or computing pass node,也可以直接将渲染实体加入对应的pass node。

    2024年02月05日
    浏览(26)
  • dx12 龙书第二章学习笔记 -- 矩阵代数

    1.矩阵及其运算 矩阵的运算 :①加②减③标量乘法 ④矩阵乘法: 矩阵乘法要有意义的条件是矩阵A的列数和矩阵B的行数必须相同,所以一般不满足交换律 ⑤转置矩阵: ⑥矩阵行列式:det A 学习行列式的主要目的是:利用它推导出求逆矩阵的公式 方阵A是可逆的,当且仅当det

    2024年02月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包