sldbtree

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

第一部分:Shader Model 版本 和  DirectX 版本的关系

 

DirectX 8.0 Shader Model 1.0 1.1

DirectX 8.0a Shader Model 1.3

DirectX 8.1 Shader Model 1.4

DirectX 9.0 Shader Model 2.0

DirectX 9.0a Shader Model 2.0a

DirectX 9.0b Shader Model 2.0b

DirectX 9.0c Shader Model 3.0

DirectX 10.0* Shader Model 4.0

DirectX 10.1* Shader Model 4.1

DirectX 11.0* Shader Model 5.0


根据微软的战略意图,WinXP是肯定是要被淘汰的。不过基础很大的中国人凭着数量还给XP的份额贡献不少力量。在XP上,我相信大多数人已经安装了DirectX9.0c,即使没有更新到这个版本的,那么游戏打包的时候给装上也不是件麻烦的事情。


由此可见,现在的PC游戏,shader应该基于3.0、4.0、5.0设计,其余的就个别的考虑吧,不再主流了。


另外,DirectX9还是能支持固定管线(fixed pipeline)的,虽然内部是基于shader的(在用固定管线的程序里,启用默认的shader)。DirectX10明确不再支持固定管线,也就是程序设计的时候必须用上shader。



第二部分:为什么需要shader的工具?


Shader工具有很多,大公司出的如下:


AMD (ATI)  - RenderMonkey (最新版本1.82,不再更新。原因未知)

Microsoft   - Effect editor 

NVIDIA       - Cg toolkit


个人比较喜欢RenderMonkey,没有原因,有可能是先入为主,可惜的是不知为何这个软件不更新了。


Shader工具的产生完全是效率的需要,美工也可以参与,程序员可以少打点字,output出的产品可以复用,compile可以查错,各个shader的版本代码不兼容,在shader中很容易控制。好处多多。


第三部分:shader的作用


其他地方能读到shader的很正规的作用说法,因此这里不用赘述。我这么解释,DirectX9.0是混合固定流水线(fixed pipeline)和可编程流水线(programmable pipeline)两种做法的唯一版本,在这个版本中,如果我们用固定流水线,其实只是接口使用上是固定流水线,在运行时(run-time)DirectX9.0内部还是把该流水线拆成可编程方式。我们可以把这个方式中用到的两个shader,看做是DirectX9.0的两个默认shader,也就是一个默认的顶点着色器(vertex shader),一个默认的像素着色器(pixel shader)。这两个着色器中的代码是固定的,在DirectX9.0发布时,微软固化了软件了代码,硬件厂家如AMD、ATI则固化了硬件代码。只要用户不指定自己的着色器,那么运行的就是这些固化的代码。结果就是,嗯,可以想象的,没有办法来根据自己的需要给顶点和像素做相关的操作。在面对无穷无尽的变化的可能下,“搭平台,而不是什么都做”就成了厂家的战略。所以,Direct10和Direct11都取消了固定流水线。这里的可编程流水线作用很明显,你可以用自己的代码来替代原来的厂家的固化代码,从而实现自己需要的效果。因为,一旦你启用自己的着色器,Direct9.0内部的代码流程就从


运行一般代码 -> 运行默认顶点着色代码 -> 运行默认像素着色代码 -> 输出


切换到


运行一般代码 -> 运行用户顶点着色代码 -> 运行用户像素着色代码 -> 输出


举例来说,你可以在DirectX代码中没有光照启用的情况下,在着色器中实现光照效果,完全不必理会有没有激活(enable)某个所谓的灯。一切都在你的掌握之中。


当然,现在的着色器很多的作用更加在于能有效的利用平衡CPU和GPU的关系,把GPU擅长的数值运算放到shader中,从而让CPU拥有更多的时间来处理逻辑,就让应用越来越完善,越来越强大。负面的问题是,自己写着色器相当于让DirectX那些本来算是渲染引擎的库在很大程度上成了一个框架,本来作为程序员,享受的就是底层封装后的轻松,现在又得回头去理解本来隐藏在内部的细节,更难过的是,3D的程序写起来,代码量是相当的大(还好HLSL、GLSL、CG等高级语言能帮助少打些字)。所以,这些也算是第二部分讲到的工具出现的部分原因吧。


理解上述红字部分,附录里的示例程序可以用来参考,在这个程序中,用户可以通过按下S键来让DirectX9.0选择自己的着色器/用户的着色器。用户的着色器是用RenderMonkey写出来的,选择了HLSL格式而不是汇编格式。这个程序的作用,就是让我们很容易理解上述两条路线。


第四部分:shader的纯粹性

到硬件层次的东西,一般都很纯粹,shader一样如此。对shader来说,顶点着色器逻辑上讲一次就只管一个顶点;几何着色器只管一个三角形;像素着色器只管一个像素。从程序封装的角度来讲,写某个shader的人,就专注在一个单一的方向设计相关的操作,不容易出错,也不会费更多的脑力。从学习的人来说,只要理解这一点,shader反而是一个让3D编程更容易理解的一条路径。这一点更详细的说明,我想两幅图看一下是必要的,第一幅在Wolfgang的ShaderX1的第6页,说明了shader在流水线中的位置(必须说明这书出的时候还没有几何着色器,因此图中没有geometric shader);第二幅图在”Real-time Volume Graphcics“的34页,说明了”顶点从本地坐标送入顶点着色器,转化成世界坐标;然后重新组合个几何面,送入几何着色器,经过处理后拆成像素,送入像素着色器,最后输出的过程”,非常形象和容易理解。不要错过!


附录:

1、一个可以切换默认着色器和指定着色器的演示。Visual Studio 2008工程。

 

posted on 2011-06-28 15:25  sldbtree  阅读(387)  评论(0)    收藏  举报