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,输入装配阶段,主要是从内存中读顶点和索引数据。

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

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

D3D11逻辑管线如下图所示:

image

首先,我们来学习一下每个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执行的流程图:

image

 

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

相关文章
|
缓存
《OpenGL编程指南(原书第9版)》——2.2 OpenGL的可编程管线
本节书摘来自华章计算机《OpenGL编程指南(原书第9版)》一书中的第2章,第2.2节,作者:(美)约翰·克赛尼希(John Kessenich)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1940 0
|
异构计算
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.
1139 0
|
存储 索引
Directx11教程39 纹理映射(9)
在myTutorialD3D11_32中,我们在PlaneModelClass中增加一个纹理TextureClass* m_Texture;读入一个grass的纹理,程序执行后的效果如下: 完整的代码请参考: 工程文件myTutorialD3D11_32 代码下载: http://files.
930 0
|
索引
Directx11教程36 纹理映射(6)
本章主要是整理代码,做以下两件事情: 1、把世界坐标矩阵的计算,放在GraphicsClass的渲染函数中,之前放在D3DClass中,而且只是返回一个单位矩阵,没任何作用。如果要使其起作用,就要对每个model类都单独设置,很麻烦,比如我要画两个颜色立方体,岂不是要建立两个model类,而只是世界坐标矩阵不同。
848 0
Directx11教程(35) 纹理映射(5)
到现在为止,我们的TextureClass初始化函数非常简单,说白了就是一行代码: result = D3DX11CreateShaderResourceViewFromFile(device, filename, NULL, NULL, &m_texture, NULL);       这行代码装入一个dds文件,而且其它选项都设置为NULL,这时系统会使用装入文件本身的格式,比如我们装入的tong.dds, 前面我们为其产生了mipmaps层,并且设置surface格式为DXT5(对应于D3D11中BC3压缩格式)。
918 0
Directx11教程(34) 纹理映射(4)
本篇教程中,我们尝试在myTutorialD3D_27中改变采样状态描述符的各种设置,看纹理贴图的方式有什么变化。 原始的代码是:     // 创建纹理采样描述符 samplerDesc.
899 0
Directx11教程41 纹理映射(11)
1、第一副图我们采用各性异性的滤波方式,并设置最大各性异性值为8.     samplerDesc.Filter =  D3D11_FILTER_ANISOTROPIC;     samplerDesc.MaxAnisotropy = 8;      第二副图我们用了常用的3线性差值滤波方式   samplerDesc.Filter =  D3D11_FILTER_MIN_MAG_MIP_LINEAR;         按道理说,对于远处的纹理贴图,第一副图要好些,但我看起来,似乎这两个效果差不多,第二副效果也还可以,对于远处的贴图,我并没有发现模糊的效果。
947 0
Directx11教程(31) 纹理映射(1)
在前面的例子中,我们要么是直接给顶点赋颜色值,要么是在顶点属性中设置Diffuse和Specular系数,从而根据光照参数计算得到物体表面颜色,但这样得到的颜色真实感要差很多。如果我们直接把一副图像映射到三角形面上,从而得到物体表面颜色值,效果会好很多,比如下面的两幅图,右边的图是把一副图片映射到2个三角形上。
975 0
|
图形学
Directx11教程40 纹理映射(10)
本章尝试使用纹理行列式,或者说纹理数组,在ps中,使用2个纹理,最终的像素颜色,是光照颜色*纹理1采样颜色*纹理2采样颜色,主要是想达到如下的效果:    把这两个图像以及光照产生的颜色融合生成以下图像:   为此我们新建一个lighttex2.
1066 0

热门文章

最新文章