Clayman的专栏

It's all about XNA & GPU Programming

孙凌峰ID:soilwork
187844次访问,排名376好友0人,关注者10
soilwork的文章
原创 85 篇
翻译 15 篇
转载 0 篇
评论 324 篇
clayman的公告
嘿嘿 ^o^....
最近评论
CYF:哈哈,楼上的楼上真搞笑。
在企业应用中,WEB是主流,也是趋势。
企业应用与图形完全是两个领域,不相干的东西,何必扯在一起?完全没可比性。。。。。。。
skbaker:应该整理一下,形成系列,方便查找。
文章对入门级用户帮助很大
kobeair:每当我要放弃的时候,我都会来你的博客,回到你写这篇帖子。学习的过程很枯燥并且现在学习的时间越来越少。但是看到这篇文章有种莫名的冲动,而且不断的问自己:“别人能做到!为什么我不行?”
lijunjun:做WEB的人最终是会后悔的.
老鬼菠萝:继续~~~
文章分类
收藏
    相册
    blogs
    David Weller
    nVidia Developer blog
    Rico Mariani
    Shawn Hargreaves
    XNA Team blog
    XNA资源
    XNA Creators Club
    ZBuffer
    Ziggyware XNA Resources
    中国XNA开发网
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 XNA Kick Start (二)收藏

    新一篇: 回家了^o^ | 旧一篇: 旅行中........

     本文版权归我所有,仅供个人学习使用,请勿转载,勿用于任何商业用途。
    由于本人水平有限,难免出错,欢迎大家和我交流。
    作者:clayman
    Blog:
    http://blog.csdn.net/soilwork
    clayman_joe@yahoo.com.cn

    硬件历史:     

           对于网页或者数据库开发者来说,通常不必深入了解CPU的结构就能编写程序。原因在于CPU是一种通用处理器,无论是上古时期的8086处理器,还是最新的Core,对同一个程序来说,虽然计算的效率不同,但总能得到相同的结果。而GPU就不同了,随便从市场里挑选两块显卡,它们所支持的功能或者说特性有可能完全不一样,在一块显卡上能运行的程序,也许到另一块显卡上就出错了。通常每次GPU的更新换代,不仅在性能上会有提高,更在功能上有所增强。图形处理器的发展分为几个阶段:

     

    没有图形处理器的远古时期:那时所有的图像显示任务都是CPU来完成的,包括坐标变换,着色等等。由于CPU并不适合完成这类需要大量并行和浮点计算的任务,因此,当时的图形显示能力相当有限,只有在非常昂贵的专业系统上,才能显示一下较为简单的3D图形。

     

    第一代图形处理器:这通常指NidiaTNT2和著名的Voodoo3系列显卡。这时的显卡有了处理2D变换和着色的能力,把CPU从填充像素的任务中解放出来,实现了DirectX 6的功能。不过更高级的3D变换仍然需要CPU来处理。

     

    第二代图形处理器:通常指Geforce2Radeon 7500系列显卡。它们最重要的突破就是从CPU那里接过了顶点变换和光照工作(也就是常说的T&L)。对应DirectX 7中的功能。

     

    第三代图形处理器:包括Geforce34Radeon 8500系列显卡。这是第一次,显卡具有了可编程能力,当然,它们只允许程序员进行一些相当有限的操作,所以严格来说,它们是半可编程的。Geforce4 Ti系列显卡完全支持DirectX 8.1

     

    第四代图形处理器Geforce FXRadeon 9xxx系列显卡。在顶点和像素级别提供了强大的可编程能力,大部分的图形处理工作已经完全转移到图形处理器上计算。支持Shader Model 2.0

     

    第五代图形处理器Geforce 67Radeon X1900系列显卡。更强的可编程能力,支持Shader Model3.0,完全兼容DirectX 9c

     

    即将上市的处理器Geforce8系列显卡,支持Shader Model 4.0,支持DirectX 10

     

           上面是否提到了太多你不熟悉的术语,哦,似乎后排的那个牛头人兄弟已经开始瞌睡了?没有关系,看完下面的几个部分之后,你就知道我在说什么了。

     

    图形硬件流水线

          

           从一堆抽象的数据,到最终把3D图形呈现在你眼前,需要经过图形硬件一系列复杂的处理,通常把这个工序称为图形流水线。详细了解图形流水线各部分的结构和作用是非常必要的。下图是一个典型的经过简化的流水线结构,第三到五代的图形处理器的流水线都与此类似:

           首先,由CPU通过XNADirectX)或者OpenGL之类的图形库,把所要渲染物体的信息传递给GPU。这些信息包括几何体的顶点位置,法线信息,颜色,纹理坐标,纹理,变换矩阵等等。这里需要说明一点,顶点是构成三维世界的基本粒子,顶点构成三角形,三角形构成面,面再组成模型。

           GPU接收到这些数据之后,首先对他们进行顶点处理。顶点处理主要指坐标变换,顶点混合,计算顶点级别的光照等一系列操作,最终把变换到投影平面的顶点数据传递给下一阶段。

           接下来的一道工序进行图元装配和光栅化。图元装配将把离散的顶点组织为三角形(三角形是图形学中的基本图元),而光栅化则把这个三角形映射为最终显示窗口中的某一部分像素,并按照像素相对于三个顶点的位置进行插值计算,得出每个像素的纹理坐标值,材质参数等所需要的值。有时,把附带了这些信息的像素称为一个片断(fragment)。

           接下来,在像素处理阶段,硬件对纹理查找获得每个像素的颜色,计算光照,在一系列着色操作之后,把最终的像素输送到帧缓冲中。

           帧缓冲是一块普通的显存,储存了所有渲染好的像素。当所有绘图操作完成之后,把这块缓冲提交给显示器,就呈现出了你所看到的图像。

           哦,你看,一个像素在硬件流水线中的旅程比坐过山车还复杂,而且还要再次提醒你,这只是一个简化的流程图。

           为了让这份资料不太快过时,再来看看未来的流水线是什么样子。你发现没有,在整个硬件流水线上,GPU都没有“创造”新顶点的能力。这严重限制了程序设计的灵活性,也是在整个图形渲染过程中仍然不得不依赖于CPU的地方:要添加或减少几何体的顶点都必须由CPU来处理。未来的硬件中(支持DirectX 10的显卡)将在顶点处理之后添加一道几何体处理工序,允许GPU创造新图元,无疑,这又将是一次重大的技术革新。

     

    Shader Model

           Shader Model(着色模型)这个词我们已经提到过很多次了,它究竟指什么意思呢?之前我们说过由于每一代显卡的功能都是不同的,那么如果每个厂商都按照各自的技术开发不同功能,那么无论对开发者或者用户来说,都是一个噩梦。因此,Microsoft推出Shader Model,作为一个规范,来精确定义可编程管线中完全兼容某个DirectX版本,硬件所必需支持的功能。比如完全兼容DirectX 9c的显卡,就意味着硬件支持Shader Model 3.0定义的所有功能。

     

    Vertex Shader Pixel Shader

           Vertex Shader(顶点着色器)它指GPU中用于处理顶点的部分,可以看做是GPU中的一个虚拟机。当然,vertex shader有时也指运行在vertex shader虚拟机上的小程序。Pixel Shader与此类似,不过指的是像素处理阶段而已。

     

    固定功能管线vs.可编程管线

           这可能是让初学者最迷惑的地方。其实他们所指的都是硬件流水线构架。记得前面讲硬件历史时说过,直道第三代图形处理器才初步具备了可编程(programmingable)能力吗?由于早期的技术限制,GPU都是不可编程的,对程序员来说,像是个黑盒子一般。GPU告诉开发者它所能实现的功能,使用每种功能时应该如何设置状态标志变量,每种功能需要些什么数据。程序员设置好GPU的状态,填充数据,然后在另一端获得输出图形。开发者无法控制整个着色过程,无论材质属性如何,光照算法都是固定的,事先设计好的,不仅仅光照,其他各种效果也都只能使用固定的算法,更为严重的是开发者很难实现API中没有提供的效果。这样的硬件构架就是固定功能管线(fixed-functin pipline)。

           这样的限制是令人讨厌的,程序员总是希望获得更多控制权。终于,随着硬件技术的发展,开发者可以对顶点和像素处理程序进行编程了。从Geforce3开始,GPU的可编程能力越来越强,可编程管线将是未来实时渲染技术发展的趋势。XNA中,已经不支持固定管线的程序开发方式了,同样,在DirectX 10中也将不再支持固定管线技术。

     

    HLSL

           可编程管线在增加控制力的同时,也增加了开发者编写程序的难度。控制GPU的着色过程,意味着程序员必须为GPU写程序了,这些程序也就是前面所说的运行在vertex shaderpiexl shader上的小程序,这里把这种小程序统一称为shader。相信到此为止,绝大部分的程序员都只为CPU写过程序,那么如何为GPU写程序:用什么语言编写程序,又如何运行这些程序呢?

           坏消息是早期的程序员只能使用一种类似于汇编的语言来编写shader。显然那是一个痛苦的年代,如今,你既然选择.net技术来开发程序,肯定不愿意再次回到汇编时代。那么接下来告诉你好消息,Microsoft认识到了编写shader的种种不便,于是在DirectX 8发布之后,与nVidia一起,开发了一门用于编写GPU程序的高级语言,Microsft把这门语言称为HLSLHigh Level Shader Language高级着色语言),而nVidia则把他称为CgC for Graphcs,注意不是CG)。最终HLSLDirectX 9.0一起发布,自然也成为了XNA的一部分。不要被它的名字所吓倒了,这实际上是一门非常简单易用,但功能强大的语言,语法几乎和C差不多,任何有C/C++,C#或者Java使用经验的人都能很快上手。由于XNA已经抛弃了固定功能管线,所以对编写XNA程序来说,学习HLSL是必须的。

           注意到我一直在说shader是“小”程序吗?Shader代码一般不会超过几百行,但普遍情况下,几十行代码就能完成一个shader。这些代码通常保存在后缀名为.fx的文件中,嵌入到C#程序中,由XNA中的Effect框架进行管理,编译,并且传递给GPU运行。不要被shader简短的代码迷惑而小看它,HLSL的设计目标之一就是用简单的代码完成复杂操作。

     

    小结

           哦,这一章讨论了在编写代码之前你所需要知道的所有硬件和软件知识。不用担心,如果有部分内容你仍然感到迷惑,随着学习的深入,便会逐渐了解。

           下一部分我们将实际动手编写一些代码,绘制一点有趣的东西了。

    ~~~~~~~~第一章完~~~~~~~~~~~~~~

    第一部分完了,都是最基础的东西,嘿,还有人在看吗@_@??

    发表于 @ 2007年02月03日 00:18:00|评论(loading...)|编辑

    新一篇: 回家了^o^ | 旧一篇: 旅行中........

    评论

    #Jamesleung 发表于2007-02-03 20:27:01  IP: 10.210.8.*
    继续期待中...刚进入这一行...太感谢Clayman...
    #nZAI 发表于2007-03-03 01:13:41  IP: 222.172.151.*
    郁闷,这么晚才看到你的文章,大饱眼福
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © clayman