原文: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中到底做了些什么。

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

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

    原文:Directx11教程(53) D3D11管线(8) GS的调度执行        在前面的教程中,我们分析了VS-PS的shader管线组合执行过程,本章我们分析一下VS-GS-PS的管线执行 ...

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

    原文:Directx11教程(18) D3D11管线(7) 光栅化阶段(RS)之后,将进入PS/OM阶段. 参考外文资料:http://fgiesen.wordpress.com/2011/07/01 ...

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

    原文:Directx11教程(17) D3D11管线(6)       VS shader输出clip空间的顶点位置及参数信息(比如颜色)到一个FIFO中,之后PA(primitive assembl ...

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

    原文:Directx11教程(16) D3D11管线(5) 本章我们学习VS中具体做些什么事情? 首先再看看我们的VS shader代码: Clolor.vs - PixelInputType Col ...

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

    原文:Directx11教程(14) D3D11管线(3)       现在我们开始学习一些CP(command processor)的知识.参考资料: http://fgiesen.wordpres ...

  6. Directx11教程(13) D3D11管线(1)

    原文:Directx11教程(13) D3D11管线(1)       从本篇教程开始,我们暂停代码的学习,先来了解一下D3D11的管线,这些管线不涉及具体的硬件,而是着重于理解能够支持D3D11的管 ...

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

    下面我们来了解一些GPU memory的知识,主要参考资料:http://fgiesen.wordpress.com/0211/07/02/a-trip-through-the-graphics-pi ...

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

    原文:Directx11教程(66) D3D11屏幕文本输出(1)      在D3D10中,通过ID3DX10Font接口对象,我们可以方便的在屏幕上输出文字信息,一个DrawText函数就能解决所 ...

  9. Directx11教程(59) tessellation学习(1)

    原文:Directx11教程(59) tessellation学习(1)       在D3D11管线中,新增加了3个stage, Hull shader, Tessellator, Domain s ...

随机推荐

  1. Jquery点击加载更多

    一.点击加载更多有点像分页获取数据类似,下面是本人写的一个简单的小例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  2. chage 修改用户密码有效期限的命令

    chage 用语法格式: chage [-l] [-m 最小天数] [-M 最大天数] [-W 警告] [-I 失效日] [-E 过期日] [-d 最后日] 用户 前面已经说的好多了,这个只是一笔带过 ...

  3. 初学linux时遇到的那些哭笑不得的问题

    1.终端中无法输入密码? 在终端输入密码,是不会在输入密码的时候看见星号或者圆点符号的.它不会有任何输入密码的视觉指示,也不会有任何光标移动,什么也不显示. 其实是输进去了,只是没有明文显示出来而已. ...

  4. LA3882 And Then There Was One

    And Then There Was One https://vjudge.net/problem/UVALive-3882 题目大意:n个数编号1..n排成一圈,第一次删除m,后来每k个删除一个(下 ...

  5. 【python之路37】with上下文管理

    一.上下文的基本实现 1.如下例,执行过程如下面代码: #!usr/bin/env python # -*- coding:utf-8 -*- import queue import contextl ...

  6. Vue开发警告[Vue warn]: Avoid replacing instance root $data. Use nested data properties instead.

    Avoid replacing instance root $data. Use nested data properties instead. 翻译 避免替换实例根$data.请改用嵌套数据属性 错 ...

  7. 前端插件--swiper.js

    使用swiper.js还要注意引入它的同时也要引入swiper.css样式文件: swiper官方文档:http://www.swiper.com.cn/api/effects/193.html 实例 ...

  8. 20190922-雅礼Day2

    先送大家几个变量名: 具体的可以去$C++ \ Reference$里看(本页 右侧/下侧 有链接) 或者等一下奇迹银桥第三氮 const int c; mutable int a; volatile ...

  9. php+js实现百度地图多点标注的方法

    本文实例讲述了php+js实现百度地图多点标注的方法.分享给大家供大家参考,具体如下: 1.php创建json数据 ? 1 2 $products = $this->product_db-> ...

  10. win10 基础上装一个 ubuntu 双系统

    1.准备一个空闲的分区: 1)确定每个磁盘都已经是 EFI 分区格式,如果不是,可以使用分区工具,将分区都转成EFI  (例如 DiskGenius 工具挺好) 2)选择一个剩余空间较大的压缩空间,压 ...