DX11渲染管道(2)

DX11渲染管道


(这里看到百度的logo我就生气,他妈的也太恶心了吧,不能直接共享它的图片。真搞不懂,那么牛叉的能力在不用搜索上,小家子气连个图片都不共享,害得哥好几个文章里面都是破图)

这里假设所有的数据都已经进入到GPU端

IA阶段:

1.state数据处理:CP把command packet中state数据通过数据总线送到shader或其它相关block,这些状态数据一般都是设置相应block的相关寄存器值。

2.为VS准备数据:首先drawcall命令为被送到IA  block(顶点装配block),IA会根据drawcall命令从video memory中取相应的顶点索引缓冲(可能会经过一个vertex cache)。当index顶点数据达到一个调度单位比如AMD的一个wave(64),NV的一个warp(32),VS调度会启动一个VS wave或者VS warp,并把它传入shader中启动执行。

3.primitive(体元)信息处理: IA阶段也会把draw中的primitive(体元)信息传到PA,以便把经过VS后的顶点装配成为相应primitive。体元就是顶点会组成一个什么几何形状,三角形还是四边形。

shader block:DX11的shader是一个通用的模块,所有的shader的处理方式都是一样的,所不同的是处理的源和处理才阶段不同。shader block,通常被叫做CU或者SIMD,它有很多的stream core组成,一般stream core是一个可以执行一维向量(x,y,z,w)浮点计算的单位,一个CU有很多streamcore组成。

 

从这里可以看出,一个streamcore是shader的一个计算单元,还有就是所有的shader都是并行处理的。

VS阶段:这样一来VS模块就简单了,唯一需要强调的就是,VS的结果是输出到一个PA(体元装配)模块。

PA阶段:PA(primitive assembly)会从该FIFO中取得顶点位置信息,并根据IA传来的primitive信息,把单独的顶点装配成点、线或者三角形。经过PA阶段后,我们不再是处理单个顶点,而是处理整个体元。

 

PA阶段的其他工作:

1.多边形裁剪:通过clip长方体的六个面来裁剪体元,把长方体(frustum)外的部分裁剪掉。

2.透视除法:(x/w,y/w,z/w,1),经过透视除法,把clip空间转化为归一化的clip空间,该空间依然是个长方体,但-1<=x<=1, –1<=y<=1, 0<=z<=1(注意:opengl的归一化裁剪空间-1<=z<=1)

3.视口转化:把归一化的x,y坐标从(-1,1)转化到像素的窗口坐标。比如窗口为800*600,就要在它们之间做个映射关系。三角形背面剔除:主要是根据三角形的法向剔除背面渲染。 

4.计算体元的梯度:计算得到的梯度会在光栅化阶段使用。

5.填充模式的处理。

RS阶段:

PA阶段后,会进入光栅化阶段,primitive会被光栅化成fragment(通常是quad, 2*2像素), 在光栅化的过程中,RS block会访问depth block,以便判定是否需要把该fragment传入到PS shader中去,同时也会更新depth block(此时更新depth block称为early z)。(我咋觉得PA阶段做的事情有点多啊,还有就是一般PA厚后就会立即RS,所以这种划分可能是认为的)

GS阶段:

VS-GS-PS流程,vs的输出会先到一个缓冲中,之后会和IA中体元信息通过shader调度模块传输到gs阶段,开始gs的wave/warp执行,gs的输出,会把体元信息传输到PA,顶点信息传输到shader output 缓冲中,最后再传送到PA,然后进行光栅化的操作。

 

PA和光栅化是紧挨着的,如果有GS和Tess的话Tess在GS前面。

 

Hull shader阶段: 

Hull shader阶段可以分成两个独立的阶段,它们是并行执行的。

第一个阶段是per control points执行的, 在这个阶段对patch中的每个控制点,输出对应的控制点。所谓patch,简单理解就是带控制点的体元,比如一个三角形,它的三个顶点是控制点,那么这个三角形就是有3个控制点的patch。当然,在Hull shader中,我们还可以对输入的控制点进行转化操作,生成新的控制点,比如输入的3个控制点,输出6个控制点。注意:输入或者输出的控制点数量是1~32。

第二个阶段就是patch常量阶段,这时HullShader会调用一个const data函数,这个函数主要产生tessellation factor,这些factor决定在TS阶段如何细分当前的patch。

另外,在Hullshader阶段还会指定一些TS阶段使用的Tessellation模式,比如细分的patch是三角形(拓扑模式),partition mode(选择什么细分算法)是HS_PARTITION等。

Tessellator阶段:

Tessellator是一个固定管线阶段,它的主要功能就是细分一个domain(三角形, 四边形或线),把它们细分成很多小的物体,比如三角形,四边形或者线。

在细分时,tessellator会在一个归一化的坐标系统中处理patch,比如输入是一个quad(四边形),但这个quad先要映射到一个单位为1的正方形上,然后tessellator会对这个正方形进行细分操作。

Tessellator是per patch操作的,Hull shader阶段传入的Tess Factor决定细分多少次,而Hull shader阶段传入的partitioning则决定选用何种细分算法。Tessellator输出为u,v, {w}坐标以及细分后domain的拓扑信息。

Domain Shader阶段:

Domain Shader 阶段会根据TS阶段生成的u,v , {w}坐标以及HS阶段传入的控制点在patch中生成细分后顶点的位置。

Domain shader是per vertex的,对于TS中每个细分产生的顶点,它都要调用一次。它的输入参数除了u,v,{w}坐标及控制点以外,还有const data,比如Tess factor等。

 

PS/OM阶段:

RS光栅化的fragment达到64或者32(一个wave或者warp)后,PS调度模块会产生一个新的wave或者warp,并把它们传给PS shader阶段,PS shader得到调度信息后,会从video memory中取得PS code,执行shader 代码。注意和vs过程类似,ps过程中,也是每个stream core处理一个fragment。

 

如果对这方面比较感兴趣的,可以看作者的原著,这里我只是添加了自己的一些话来帮助自己理解,尊重原著才是关键。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值