概览

在前面的教程中,我们设置一个顶点缓存并将一个三角形传递到GPU。现在,我们将看一下图形管线的各个阶段是如何工作的,我们会解释shader的概念和effect系统。

注意:这个教程的共享前一个教程的代码,但强调不同的部分。

源代码

(SDK root)\Samples\C++\Direct3D10\Tutorials\Tutorial03

图形管线

在前面的教程中,我们创建了顶点缓存,将一个顶点格式(vertex layout)连接到一个technique对象。现在,我们解释一下technique对象和组成它的shader。要完全理解shader,我们需要看一下图形管线的整个流程。

在教程2中,当我们从technique中调用Apply方法,实际上是将shader绑定到管线的一个阶段中。然后,当我们调用Draw时,就开始访问传递到图形管线的顶点数据。下面的几个部分介绍了Draw命令执行之后的过程细节。

Shader

在Direct3D 10中,shader存在于图形管线的不同阶段。它们是由GPU执行的短小代码程序,获取特定的输入数据,处理这些数据,然后将结果输出到管线的下一阶段。Direct3D 10支持三种类型的shader:顶点着色器(vertex shader)几何着色器(geometry shader)像素着色器(pixel shader)。顶点着色器以顶点作为输入,当每个顶点通过顶点缓存传递到GPU时顶点着色器会执行一次。几何着色器以图元作为输入,当每个图元传递到GPU时执行一次。图元可以是一个点、一条线或一个三角形。像素着色器以像素(有时又被称为片段fragment)作为输入,在你想要绘制的图元上的每个像素上执行一次。当使用Direct3D 10进行绘制时,GPU必须要有一个正确的顶点着色器和像素着色器。几何着色器是Direct3D 10的高级功能,是可选的,所以本教程不讨论几何着色器。

顶点着色器

顶点着色器是执行在GPU上的处理顶点的小程序。可以将顶点着色器看出一个以顶点为参数的C函数,它处理出入的数据,输出为经过修改的顶点。在应用程序以顶点缓存的形式将顶点数据传输入GPU之后,会对每个顶点执行顶点着色器一次,将每个顶点数据作为顶点着色器的输入参数。

顶点着色器可以完成很多任务,最重要的就是变换。变换就是将顶点从一个坐标系统转换为另一个的处理过程。例如,一个3D场景中的三角形顶点的位置为(0, 0, 0) (1, 0, 0) (0, 1, 0)。当三角形绘制在一张2D纹理缓存时,GPU必须知道在一张2D纹理缓存何处绘制三角形,GPU必须知道点的2D坐标,正是变换帮助我们完成了上述工作。变换的细节将在下一个教程中加以讨论。本教程中我们会使用一个简单的顶点着色器,它只是将输入数据直接输出。

在教程中,我们使用高级着色语言(High-Level Shading Language,HLSL)编写shader,应用程序会在effect系统中使用这些shader。我们的顶点数据具有一个3D位置元素,本教程中的顶点着色器对输入数据不进行任何操作。顶点着色器的代码如下:

1
2
3
4
float4 VS( float4 Pos : POSITION ) : SV_POSITION
{
     return Pos;
}

顶点着色器看起来很像C函数,HLSL使用与C类似的语法,这样C/C++程序员学起来会更容易。我们看到这个名为VS的顶点着色器使用一个float4类型的参数,返回值也是一个float4值。在HLSL中,一个float4类型的数据是一个有4个分量的矢量。每个分量都是浮点数。冒号定义参数的语义和返回值。前面已经提到过,HLSL中的语义表示数据的性质。在上面的shader中,我们选择POSITION作为Pos输入参数的语义,因为这个参数包含顶点位置。返回值的语义,SV_POSITION,是一个具有特殊含义的预定义语义。这个语义告诉图形管线与这个语义对应的数据定义了剪裁空间的位置,而GPU需要这个位置数据在屏幕上绘制像素。(我们会在下一个教程中讨论剪裁空间。)在上面的shader中,我们获取输入的位置数据,然后将相同的数据返回到管线中。

像素着色器

现代计算机显示器通常是光栅显示的,即屏幕是一个由小点构成的二维网格,这些小点称为像素。每个像素包含一个独立于其他像素的颜色。当在屏幕上绘制三角形时,我们实际上并没有绘制一个完整的三角形,只是点亮被三角形区域覆盖的一组像素,如图2所示。

图2. 左图:我们想绘制的三角形。右图:屏幕上的实际显示。

将三角形转换为一组像素的过程称为光栅化(rasterization)。GPU首先判断哪些像素被三角形覆盖,然后调用这些像素的像素着色器。像素着色器的首要目的就是计算每个像素的颜色。像素着色器获取要着色的像素作为输入数据,计算像素的颜色,然后将输出结果返回到图形管线。输入数据来自于几何着色器,如果几何着色器不存在,就像本教程一样,则直接来自于顶点着色器。

上面的顶点着色器输出了一个语义为SV_POSITION的float4数据,这个数据就是像素着色器的输入。因为像素着色器输出颜色值,所以输出类型为float4。输出的语义为SV_TARGET 表示输出到渲染目标格式。代码如下:

1
2
3
4
float4 PS( float4 Pos : SV_POSITION ) : SV_Target
{
     return float4( 1.0f, 1.0f, 0.0f, 1.0f ); // Yellow, with Alpha = 1
}

Effect系统

我们的effect文件由两个shader组成,顶点着色器和像素着色器,还有technique定义。Technique定义设置对应的着色器。另外还有语义用于编译着色器。注意:本教程中几何着色器为NULL,因为此处不需要。

1
2
3
4
5
6
7
8
9
10
// Technique Definition
technique10 Render
{
     pass P0
     {
         SetVertexShader( CompileShader( vs_4_0, VS() ) );
         SetGeometryShader( NULL );
         SetPixelShader( CompileShader( ps_4_0, PS() ) );
     }
}

创建Effect和Effect Technique

在应用程序代码中,我们需要创建一个effect对象。Effect对象代表effect文件,它是通过调用D3D10CreateEffectFromFile()创建的。创建了effect对象之后,我们就可以调用ID3D10Effect::GetTechniqueByName()方法,传递“Render”作为名称来获取technique对象,然后使用这个对象进行实际的绘制工作。代码如下:

1
2
3
4
5
6
7
// 创建effect
if ( FAILED( D3DX10CreateEffectFromFile( L "Tutorial03.fx" , NULL, NULL, D3D10_SHADER_ENABLE_STRICTNESS, 0,
     g_pd3dDevice, NULL, NULL, &g_pEffect, NULL ) ) )
         return FALSE;
// 获取technique
g_pTechnique = g_pEffect->GetTechniqueByName( "Render" );

整合在一起

在分析了图形管线之后,我们就会理解绘制一个三角形的过程。创建一个Direct3D程序需要两个步骤。一是创建顶点数据,我们已经在教程2中讨论过了。二是创建着色器转换要绘制的数据,这是在本教程中讨论的。

Direct3D 10教程3:Shaders和Effect系统相关推荐

  1. Direct3D 10系统

    作者:David Blythe 本文版权归原作者所有,仅供个人学习使用,请勿转载,勿用于任何商业用途. 由于本人水平有限,难免出错,不清楚的地方请大家以原著为准.欢迎大家和我多多交流. 翻译:clay ...

  2. Direct3D 10系统(三)

    Direct3D 10系统(三)  作者:David Blythe 本文版权归原作者所有,仅供个人学习使用,请勿转载,勿用于任何商业用途. 由于本人水平有限,难免出错,不清楚的地方请大家以原著为准.欢 ...

  3. Direct3D 10系统(二)

    Direct3D 10系统(二) 作者:David Blythe 本文版权归原作者所有,仅供个人学习使用,请勿转载,勿用于任何商业用途. 由于本人水平有限,难免出错,不清楚的地方请大家以原著为准.欢迎 ...

  4. Direct3D 10系统(一)

    Direct3D 10系统(一) 作者:David Blythe 本文版权归原作者所有,仅供个人学习使用,请勿转载,勿用于任何商业用途. 由于本人水平有限,难免出错,不清楚的地方请大家以原著为准.欢迎 ...

  5. Direct3D 10系统(四)

    Direct3D 10系统(四)  作者:David Blythe 本文版权归原作者所有,仅供个人学习使用,请勿转载,勿用于任何商业用途. 由于本人水平有限,难免出错,不清楚的地方请大家以原著为准.欢 ...

  6. 预装Windows 10的电脑改装成 Win7 系统的参考教程

    由于近几年硬件和软件技术发展迅猛,目前联想.戴尔等品牌笔记本都预装了Windows 10操作系统.上一篇文章我提到"Win 10"由于系统稳定性和用户使用习惯问题,经常有朋友要我帮 ...

  7. Direct3D 10

    微软的vista 带了个大家伙 这个可能会导致硬件升级,开发人员为之疯狂的的大家伙. Direct3D 10 要来了 这不仅仅是两位数的飞跃,D3D10图形流水线给出了绘制架构的根本性变化,为了增强了 ...

  8. 【Visual C++】游戏开发四十八 浅墨DirectX教程十六 三维地形系统的实现

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  9. 【Visual C++】游戏开发四十八 浅墨DirectX教程十六 三维地形系统的实现

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhmxy555/article/details/8685546 作者:毛星云(浅墨) ...

最新文章

  1. django文件上传
  2. leetcode: Linked List Cycle II
  3. 第二阶段_第五小节_C#基础3
  4. HDU - 6610 Game(带修莫队)
  5. 查找unity工程代码中中文字符
  6. 解决VB6.0中不能加载MSCOMCTL.OCX的错误提示
  7. mysql的常用引擎
  8. GIS应用技巧之定义图框样式
  9. html5调用js播放视频,h5+js实现视频播放的方法
  10. ps怎么去掉框框不伤字体_PS如何去掉和替换图片中的文字? 照着学就行了
  11. 如何讲好一个故事(6个要素)
  12. linux 活动主分区,主引导扇区(MBR),分区表(DPT)及活动分区(DBR) | 技术部落
  13. OpenGL ES OpenGL WebGL EGL WGL 区别
  14. AT命令交互之-COPS选择营运商
  15. Dreamweaver cs3快捷键一览
  16. InputArray和OutputArray的那些事
  17. [征询意见]关于博客园与出版社合作出书
  18. 从数组到类簇的学习总结
  19. python程序怎么运行结果
  20. 创业十诫之三:忽视成本预算

热门文章

  1. 东芝打印机报故障维修CD40
  2. 利用ArcGIS快速生成等高线边界,完成地形图拼图
  3. 利用wget批量下载http目录下文件
  4. html5制作3d效果图,一篇文章教会你利用html5和css3实现3D立方体效果图
  5. 安装Mysql时出现服务未启动(start service)解决办法
  6. FANUC机器人伺服放大器的标准设置和电缆连接功能说明
  7. 点击表格列变色,让表格的偶数排变色,点击表格的行让其变色
  8. 如何用Alien Skin Exposure将照片后期调色教程。一起get这招神技能吧~
  9. AirPods 使用技巧---十大隐藏功能
  10. VMware 安装 银河麒麟高级服务器操作系统 V10 + QT 开发环境搭建