第一部分:Shader
DirectX
DirectX
DirectX
DirectX
DirectX
DirectX
DirectX
DirectX
DirectX
DirectX
根据微软的战略意图,WinXP是肯定是要被淘汰的。不过基础很大的中国人凭着数量还给XP的份额贡献不少力量。在XP上,我相信大多数人已经安装了DirectX9.0c,即使没有更新到这个版本的,那么游戏打包的时候给装上也不是件麻烦的事情。
由此可见,现在的PC游戏,shader应该基于3.0、4.0、5.0设计,其余的就个别的考虑吧,不再主流了。
另外,DirectX9还是能支持固定管线(fixed
第二部分:为什么需要shader的工具?
Shader工具有很多,大公司出的如下:
AMD (ATI)
Microsoft
NVIDIA
个人比较喜欢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工程。

浙公网安备 33010602011771号