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/

  

 

除了装配primitive外,PA阶段还会做一些其它的工作:

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

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

视口转化:把归一化的x,y坐标从(-1,1)转化到像素的窗口坐标。比如窗口为800*600,就要在它们之间做个映射关系。

三角形背面剔除:主要是根据三角形的法向剔除背面渲染。

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

填充模式的处理。

     PA阶段后,会进入光栅化阶段,primitive会被光栅化成fragment(通常是quad, 2*2像素), 在光栅化的过程中,RS block会访问depth block,以便判定是否需要把该fragment传入到PS shader中去,同时也会更新depth block(此时更新depth block称为early z)。

    光栅化算法不在这儿讨论了,有兴趣可以随便找一本计算机图像学的书看看。

时间: 2024-10-14 20:43:48

Directx11教程(17) D3D11管线(6)的相关文章

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教程(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 shade

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教程(66) D3D11屏幕文本输出(1)

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

PHP开发框架Yii Framework教程(17) UI 组件 TabView示例

CTabView 用来显示分页标签,使用TabView的基本方法是配置tabs属性,每个Tab可以配置如下属性 title:标签标 题. content: 标签显示内容. view: 标签显示View的名称,如果同时制定Content,则显示Content内容. url: 点击该 标签时页面重定向到指定URL. data: 当指定View属性时传给该View的属性数组. 本例显示三个标签页,分别使用不同 的标签内容: <center class="form"> <?p

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

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