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;

    // Calculate the position of the vertex against the world, view, and projection matrices.
    output.position = mul(input.position, worldMatrix);
    output.position = mul(output.position, viewMatrix);
    output.position = mul(output.position, projectionMatrix);
   
    // Store the input color for the pixel shader to use.
    output.color = input.color;
   
    return output;

}

    我们现在知道的信息是:MatrixBuffer被UMD放在了video memory中的const buffer,并在VS开始执行的时候被传入shader。

    shader block,通常被叫做CU或者SIMD,它有很多的stream core组成,一般stream core是一个可以执行一维向量(x,y,z,w)浮点计算的单位,一个CU有很多streamcore组成,这个我们OpenCL教程中曾经给过很多图。

在VS中,很多stream core并行执行,每一个stream core处理一个顶点的VS shader计算。

从我们的VS shader代码中,可以知道,它主要做空间转化。

// Change the position vector to be 4 units for proper matrix calculations.
input.position.w = 1.0f;

// Calculate the position of the vertex against the world, view, and projection matrices.
output.position = mul(input.position, worldMatrix);
output.position = mul(output.position, viewMatrix);
output.position = mul(output.position, projectionMatrix);

把顶点从世界坐标系中转化到齐次clip空间中。具体的推导大家可以查询相关资料。

推荐Mathematics.for.3D.Game.Programming.and.Computer.Graphics.Lengyel.3ed.Course2012这本书。

注意:clip裁剪空间是一个长方体,

-r <= x <= r (r是窗口宽高比例)

-1 <= y <= 1

f <= z <= n (f,n近平面和远平面距离)。

   

     另外VS shader还把顶点颜色传到下一个阶段,在我们前面的教程中,我们都是直接给顶点赋颜色值,通常的做法是根据顶点法向和光照来计算颜色,这些代码通常也在VS shader中,在后面的其它教程中,我们也会逐渐学习这些知识。

     VS shader计算出来的顶点会放在一个FIFO中,在D3D11逻辑管线中,下一个stage是RS,其实在大部分硬件中,VS FIFO(不考虑GS,tessellation操作)的内容会传输到一个固定管线称作PA(体元装配),在这个阶段执行透视除法,clip等操作,下一节,我们来学习了解PA的功能。

 

时间: 2024-10-10 17:15:57

Directx11教程(16) D3D11管线(5)的相关文章

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教程(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管线(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教程(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教程(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渲染的方式,把文本染出来,但这种方法不是很灵活,英文还好说,字母字符就那么多,但对于汉字就麻烦了,另外字体

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

CStarRating 主要用于评分,显示一组星星(5 个)用于打分. 基本用法如下 <center class="form"> <?php $form=$this->beginWidget('CActiveForm'); ?> <?php $this->widget('CStarRating',array( 'model'=>$model, 'attribute'=>'rating', 'name'=>'rating', '

Directx11教程(4) 一个最基本D3D应用程序(2)

接着上篇教程的代码,本篇加入基本的D3D代码,实现一个完整的D3D11程序框架. 我们增加一个新类D3DClass, 用来处理3D渲染功能.增加该类后,程序的框架如下图:     GraphicsClass.h代码改变如下, 主要是增加了一个D3DClass类成员变量,在Render函数中,将会调用D3DClass的相应Render函数,比如BeginScene.EndScene,BeginScene主要是清除framebuffer,设置渲染背景颜色,而EndScene则是把交换前后缓冲,使当前