Directx11教程(15) D3D11管线(4)

本章我们首先了解一下D3D11中的逻辑管线,认识一下管线中每个stage的含义。

参考资料:http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-3/

D3D11逻辑管线如下图所示:

首先,我们来学习一下每个stage的名字含义,在后面章节学习它们的细节功能:

IA:input assembler,输入装配阶段,主要是从内存中读顶点和索引数据。

VS: vertex shader, 顶点着色阶段,在shader中逐个处理顶点,输出处理后的顶点。

HS: hull shader,这是D3D11中增加的阶段,主要是tessllation使用,输入patch(其实就是带控制点的体元),产生控制点,被domain shader阶段使用,也可以在HS阶段,增加一些额外的控制点数据。HS阶段还会产生TS阶段使用细分因子(FACTOR)。

TS: Tessellation stage,细分三角形,quad或者线段,产生顶点和连通性。

DS: Domain shader, 从HS得到控制点,从TS得,顶点uv坐标,产生最终的细分顶点。

GS: geometry shader,输入体元,输出不同的体元。

SO: streamout stage, 把GS之后的顶点数据输出到video memory中。

RS: Rasterize stage, 光栅化阶段,光栅化体元。

PS: pixel shader, 对光栅化后的体元,进行逐像素操作,通常执行纹理光照颜色混合等。

OM: output merge stage,执行一些blending操作,并把像素颜色输出到framebuffer中,最终在屏幕上显示出来。

    

      当然除了上述阶段之外,也可以把整个D3D11管线理解为一个computer shader阶段,来做一些通用计算,后面有机会在详细了解。

在D3D11的逻辑管线中,有些shader阶段是可选的,比如GS,Tessellation等。

我们通常使用的shader阶段组合是:

VS-PS

VS-GS-PS

VS-HS-TS-DS-PS

VS-HS-TS-DS-GS-PS

VS-SO

VS-GS-SO

VS-HS-TS-DS-GO-SO

下面,我们接着上一篇教程,结合逻辑管线和物理管线来了解IA阶段GPU做些什么事情。

     上一章中,我们的顶点已经经过了driver层,到达了video memory中,我们的状态设置和draw call命令也通过driver到达了CP的FIFO中,正准备被CP调度到不同的硬件block中去。

现在我们看看IA阶段做些什么工作(我们只是画一个三角形,所以只有VS-PS):

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

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

     IA阶段也会把draw中的primitive(体元)信息传到PA,以便把经过VS后的顶点装配成为相应primitive。

     现在的shader几乎都用的是统一架构shader block,即VS,PS,GS…等的执行都在一个block中。Shader启动执行后,会从video memroy中取得顶点/实例数据和shader code,然后一条指令一条指令开始执行我们的VS code,执行后的结果会被传送给PA。

      下面是一个简单的vs执行的流程图:

 

本章我们了解IA阶段GPU做的工作,下章我们将详细了解VS shader中到底做了些什么。

时间: 2024-10-14 14:07:42

Directx11教程(15) D3D11管线(4)的相关文章

Directx11教程(18) D3D11管线(7)

光栅化阶段(RS)之后,将进入PS/OM阶段. 参考外文资料:http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-7/ 大致的管线流程应该是这样的:       RS光栅化的fragment达到64或者32(一个wave或者warp)后,PS调度模块会产生一个新的wave或者warp,并把它们传给PS shader阶段,PS shader得到调度信息后,会从video mem

Directx11教程(16) D3D11管线(5)

本章我们学习VS中具体做些什么事情? 首先再看看我们的VS shader代码: Clolor.vs - PixelInputType ColorVertexShader(VertexInputType input) {     PixelInputType output;         // Change the position vector to be 4 units for proper matrix calculations.     input.position.w = 1.0f;

Directx11教程(53) D3D11管线(8) GS的调度执行

       在前面的教程中,我们分析了VS-PS的shader管线组合执行过程,本章我们分析一下VS-GS-PS的管线执行过程,主要是GS阶段hardware何如调度.      参考资料:http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-8/      从D3D10开始,D3D 管线中增加了GS 阶段,如下图所示:        从前面的教程中,我们知道在VS-PS的管

Directx11教程(14) D3D11管线(3)

      现在我们开始学习一些CP(command processor)的知识.参考资料: http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-3/       CP(command processor)应该是GPU最前端的block,它从位于video memory中的command buffer中取出UMD产生的command packet,比如状态设置,drawInd

Directx11教程(14) D3D11管线(2)

下面我们来了解一些GPU memory的知识,主要参考资料:http://fgiesen.wordpress.com/0211/07/02/a-trip-through-the-graphics-pipeline-2011-part-2      [注:请参考另一篇日志:2012-11-13:http://www.cnblogs.com/mikewolf2002/archive/2012/11/13/2768804.html]    下面我们看下memory 如何与GPU和 host连接,了解v

Directx11教程(17) D3D11管线(6)

      VS shader输出clip空间的顶点位置及参数信息(比如颜色)到一个FIFO中,之后PA(primitive assembly)会从该FIFO中取得顶点位置信息,并根据IA传来的primitive信息,把单独的顶点装配成点.线或者三角形.经过PA阶段后,我们不再是处理单个顶点,而是处理整个体元. 参考资料:http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-5

Directx11教程(66) D3D11屏幕文本输出(1)

     在D3D10中,通过ID3DX10Font接口对象,我们可以方便的在屏幕上输出文字信息,一个DrawText函数就能解决所有问题,但在D3D11中个,这个变得超级麻烦,因为微软移除了Font接口,要在屏幕上输出文本,用户需要做很多事情. 通常我们可以用以下的方法来输出文本信息: (1)用纹理贴图的方法,把所有的字体存储在一张纹理上,再做一个字体查询表,对应纹理的相应位置,可以用2D渲染的方式,把文本染出来,但这种方法不是很灵活,英文还好说,字母字符就那么多,但对于汉字就麻烦了,另外字体

Directx11教程(19) 画一个简单的地形

      通常我们在xz平面定义一个二维的网格,然后y的值根据一定的函数计算得到,比如正弦.余弦函数的组合等等,可以得到一个看似不错的地形或者水面的效果. 在本教程中我们修改ModelClass.h和ModelClass.cpp,得到一个近似的地形.         在本章代码中,我们定义300*300=90000个顶点,共(300-1)(300-1)*2个三角形,每个网格的大小都为1.     我们得到y值的函数为: float ModelClass::getHeight(float x,

Directx11教程(5) 画一个简单的三角形(1)

      在本篇教程中,我们将通过D3D11画一个简单的三角形.在D3D11中,GPU的渲染主要通过shader来操作(当然还有一些操作是由GPU固定管线完成,比如光栅化操作),最常用的shader操作是顶点shader(vertex shader)和像素shader(pixel shader).其实shader就是在GPU中执行的代码,这些代码被driver编译成硬件依赖的机器码,最终被GPU中shader pipe执行,从而完成3D渲染.D3D11中shader是用一种类C的语言HLSL编