Cg与RenderMonkey 之旅
http://news.mydrivers.com/1/15/15020_all.htm
【前言】
您可能还没有意识到---您手头的这块显卡(或者说这块GPU)---它不仅仅是一个应用工具(游戏、平面设计或诸如此类)---它还是一个开发工具。
游戏开发者的硬件配置似乎总比我们普通用户的要高(当然是指3D游戏的开发者,现在没有游戏不是3D的了吧?抛开多如牛毛的FPS不说,一直是2D唱主角的RTS,如魔兽争霸III到命令与征服-将军也都已毫不例外的转到了3D),在“ATi的魔咒日-程序员的训练课程” http://www2.gb.tomshardware.com/business/02q4/021010/index.html上,ATi给每位程序员一台配有Radeon9700的计算机,似乎这才是游戏程序员的标准配置,那时我们驱动之家评测室才刚刚拿到9700样品,ATi官方网站的报价是$399。
专业图形领域的机器配置就更不用说了,从IBM到HP到SGI,各类图形工作站的配置令人惊艳,当然价格也是高的令人咋舌。
可恶的是,画面效果从来都是游戏,特别是3D游戏的中心,要做出最新、最眩的游戏来打入市场,游戏制作者不得不采用最新的游戏引擎,使用高端甚至专业配置。
GPU的出现和疯狂的更新换代改变了这一切。得到同样的速度和效果,原本要花掉成千上万美金堆积起来的设备,现在一颗小小的GPU将会取而代之,而且它的成本将会低得多,Quadro系列显卡就是最好的例子;另一方面,频繁的更新换代使得新产品不断降价并迅速进入主流市场,比如前面提到的9700(9500),相信本文的部分读者已经在使用它了。
您注意到了吗?普通用户和各类专业开发人员在硬件配置上的差距正在不断缩小。现在的情况是,不管是游戏还是作图,一块最新一代的显卡(GPU),在能够展示其特效的游戏或新版应用软件还未上市之前,它就已经插到了你的主板上,这时,你的机器配置本身就是超前的,它完全可以用作开发工具;或者由于现在的娱乐级显卡功能也过于强大---强大到我们完全可以把它当作专业卡来使用---譬如---SoftQuadro4。
我为Shader而疯狂
在DX8、DX9的推动下,Shader成为了PC世界3D领域的主宰,新的GPU、新的API、新的游戏到新的应用程序,硬件设计者、软件开发者到疯狂的游戏迷都开始围着Shader打转,数百万的用户下载3Dmark03,或为了测试机器的Shader速度,或只是为了争相目睹新版Shader所带来的实时画面效果。
3D游戏开发制作者当然也从来没有像今天这样为Shader而着迷,但是制作游戏并不象玩游戏那么简单,一开始他们碰了壁,由于没有合适的工具,因此大多数3D图形开发者没有办法发挥它们的全部潜能。而造成这个现象的主要原因就是,以上的显示卡如果要实现硬件的像素渲染和顶点渲染编程就必须要使用低级的汇编语言来进行,我们知道汇编编程的工作量极大而且难度是非常高,对于显示卡要达到的特效显然要求应该更高,因为众多的3D图像程序员都很难发挥这些显示卡硬件渲染方面的可编程性。这也正是当初DX8发布后,DX8游戏迟迟不能上市的原因之一。
GPU的重要特性就是硬件可编程性,目前所推出的可程序化显卡包括有nVIDIA的Geforce 3及Geforce 4钛系列的产品(不含GF4MX系列)、Xbox主机(GF3.5)、Matrox Parhelia、3Dlabs的P10及ATi所推出的Radeon 8500、9000、9700镭系列显卡。然而,这些显卡的可程序化特性均被列为机密,并仅能通过DirectX 8(DX8)内的顶点着色(VS)及像素着色(PS)接口来使用,硬件可编程特性并未被真正利用。
nVIDIA公布的GPU的Shader支持列表
如果这几年你一直是图形卡的关注者,你一定看到了两个重大的转变,第一个转变自然是速度上的成倍增长,快的甩下了CPU界的摩尔定律,第二个转变则是工作方式上的转变,图形卡已经从CPU的随从---为CPU渲染提供帧缓冲的工具,转变为独立的GPU---它提供完全可编程特效单元、数倍的三角形生成和转换引擎、完全的硬件光照和硬件抗锯齿等等几乎所有的一切。
生活在GPU时代,为什么3D程序的开发还是那么复杂呢?不是GPU晶体管数量不够,而是现在的图形硬件已经超越了开发者使用它的能力。
我们需要GPU设计制造者提供一种高级编程语言,让图形编程的开发人员可以利用这些高级语言可以更加快捷、高效的写出所需的图形程序来,然后利用他们自己提供的编译器或者是类库将开发人员所写的这些高级语言转换成高效的,由他们各自的显卡所支持的计算指令集(汇编语言),来最终形成计算机上的图形。这样可以保证按照最快的速度来显示开发人员想得到图形,而开发人员又不必为复杂的硬件计算指令以及如何优化这些硬件指令而烦恼。
在这样的情况下,HLSL、Cg与RenderMonkey应运而生。
C语言是目前世界上流行、使用最广泛的高级程序设计语言。对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它高级语言,C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件、三维、二维图形和动画,它是数值计算的高级语言。但是C语言是围绕着CPU的,nVIDIA需要为GPU量身度作的C语言,为此它开发了Cg---“C for graphics”。
GDC2003上公布的Shader语言列表,Cg只是其中之一
【Cg篇】
Cg语言是全新的类C高级编程语言,在微软的帮助下我们看到了它的雏形,有意思的是Cg语言不但支持普通的DirectX图形接口,对OpenGL图形接口也提供了完备的支持。Cg语言主要包括两个部分,Cg语言特征、Cg编译器,而且这种编译器可以使用高级语言数据类型。Cg语言适用性相当强,开发者可在多种平台上使用同其它编程语言相比,Cg是非常特殊的,它提供了Cg浏览器(Browser,针对语言属性和可视化操作),从而可以让开发变得更简单。另外Cg语言已经获得了大量数字内容生成和游戏开发产商的认证支持。这样显然Cg语言比其它任何的语言都更适合于3D游戏卡程序开发。由于采用C作为开发蓝本,因此开发者可以在很多平台上使用Cg语言,比如:Cg可以使用在Windows、Linux、Mac OS、Xbox下。并且由于同时支持DX8和OpenGL 1.4,因此Cg语言的适用性就更广了。
Cg语言非常灵活、并且考虑了最大限度的兼容性。这里,我们需要说明白的一点就是,Cg具备很高的效率,因为Cg其实就是提供了应用程序同硬件加速规范的中间层,应用程序通过Cg来调用DX和OpenGL,而原来这些功能是通过汇编调用的。所以说Cg不但可以大大降低编程的繁杂度,并且保持了汇编的高效性。使用Cg的开发环境,图像编程就成了书写Cg代码的过程,随后,通过Cg编译器产生低级的汇编代码,这样开发者再也不用去直接接触图形核心的细节了。
Cg与GPU及应用程序之间的架构
nVIDIA非常希望Cg可以成为一个图像上的标准,这样在不远的未来就创造出漂亮的令人惊讶和真实的3D场景。而目前的游戏世界还深陷在帧渲染以及固定渲染的的泥潭中,几年以来游戏画面都没有太大的改观。不过,目前有了Cg语言,这就可以充分地发挥显示核心的真正特性,从而实现更出色的3D效果。
最新的Cg 工具包可从http://developer.nvidia.com/view.asp?IO=cg_toolkit下载。nVIDIA Cg Toolkit 1.1包括以下组件:
nVIDIA宣称在未来的一年中Cg将可以给我们带来电影品质的3D图像,而现在的显示卡都只能实现普通的帧渲染。Cg可以更好地使用图形核心的可编程特性,可以提高开发速度,使开发者可以共享和重用代码,nVIDIA称Cg为一个“工业标准语言”。因此,ATi、Matrox、3D Labs等显示核心厂商会推出它们自己的Cg优化版本,基本的DX8和DX9渲染代码都能够适用nVIDIA编译器运行在它们的硬件上,DX9渲染是从微软的编译器派生的,而OpenGL 1.4的代码通过其它编译器生成。因此,从现实意义上来说Cg已经真正走到了前台。和统一驱动体系(Unified Driver Architecture)类似,在Cg上使用了nVIDIA的统一编译体系,这使得Cg可以向后兼容。不同的用户可以使用Cg的预编译模式或者实时编译模式。如果没有Cg,图像开发者要直接面对GPU的细节和图像API,增加了开发者的开发时间,并且这种整合式的支持也对开发的跨平台性做了很好的规范。其实Cg可以带来的最大特点,还是3D图形效果质量的提升。因为Cg已经预置了众多3D特效的命令,要达到一定的效果我们仅仅需要使用1-2条命令就足够了。同时这也可以促进非专业3D图形程序员,开发出出色效果的3D画面,因为要达到这个目的,只要你具备C语言开发能力就足够了。
Cg已经得到众多游戏开发商、数码内容制作(DCC)软件厂商以及渲染技术厂商的支持,其中包括Alias Wavefront、Discreet、Luxology以及Softimage,视频产品领域的翘楚Digital Immersion Software公司具备实时渲染功能的Presenter 3D™ 1.1版已在Cg的帮助下浮出水面。这种基于Cg 的新版Presenter 3D旨在简化操作,提升机械CAD设计师的工作效率,它可以直接嵌入Autodesk Inventor之中。此外还包括Valve Entertainment, Sony Online Entertainment和Microsoft's Games Division;Cg还有其它更多的大众游戏和DCC数字签名。第一个Cg应用会是Maya、SoftImage、3ds Max和Lightwave的软件插件,这些插件非常重要,它可以使开发者在像素和顶点渲染上创建3D艺术品。
Presenter3D的界面
通过Cg实现实时渲染的Presenter3D
Cg for Visual Studio
安装我们下载的Cg Toolkit,安装程序会提示是否建立MS Visual Studio与Cg shaders的关联(选择“是”,如果你已经安装了MS Visual Studio)。建立关联后,在Visual Studio中打开*.Cg文件进行编辑,可以看到Cg语言的编辑和标准C++语言是一样的,包括语法颜色的提示,在编辑过程中可以随时按下“Control+F7”进行编译,所有的语法错误都会被高亮显示。
选择建立文件关联
在MS Visual Studio中编辑Cg
在安装后的C:\Program Files\NVIDIA Corporation\SDK\MEDIA\programs文件夹中,有各种类型的Cg源代码,通过对这些简单的Cg小程序的学习,可以让我们迅速的掌握Cg语言图形编程技术。
Cg for 3ds max
实时渲染一直是图形设计者的梦想,OpenGL ARB曾经是图形技术上的巨大进步,它把矢量模型转化为实体,得到接近于真实的效果,在OpenGL状态下,我们可以看到颜色、材质、光照和阴影,但是它停滞不前的缓慢发展速度,使它与实时渲染的要求越来越远,在表现如金属的光泽、水面的反射、玻璃的透明等效果上OpenGL ARB都显得无能为力,最终不得不依赖于CPU的渲染,而这些效果则是迅速改进的DX的强项---Pixel Shader和Vertex Shader很容易就能实现这些效果。虽然由nVIDIA、ATi等硬件厂商提供的最新版的OpenGL已经加入了对Shader的支持,但是为了保持最大范围的兼容性,因此许多专业设计软件的OpenGL界面基本上还是仅限于ARB的OpenGL规范。
在驱动之家评测室的《图形世界分裂的两派——理清D3D和OpenGL的脉络》一文中http://hardware.mydrivers.com/page/ctdir1/2002,12,05,77,3.htm我们看到D3D已经有了比OpenGL更好的显示效果,但是我们不太可能看到DCC软件厂商抛弃工业标准的OpenGL而转投D3D的怀抱,在OpenGL 2.0普及以前,Cg Plug-in会是最好的选择。
需要指出的是,Cg Plug-in其实是对API的扩展,在前面的架构图上我们可以看到它可以通过D3D和OpenGL,甚至绕过它们与应用程序进行数据交换,这保证了它始终可以利用功能最为强大的API,从而不断延续它的生命力。
在http://developer.nvidia.com/view.asp?IO=IO_3dsmaxCgFXPlugin我们可以下载到3ds max Cg Plug-in for 3ds max 5.1。
安装3ds max Cg Plug-in for 3ds max 5.1
同样需要指出的是,Cg Plug-in仍然是通过D3D API在3ds max上应用shader特效的,所以在安装Cg Plug-in for 3ds max以前,你必须要有硬件支持DX8.1以上的显卡+DX8.1以上版本+3ds max 5,并且在3ds max 5的CustomizePreferences Viewport里将当前驱动设为D3D。如果你坚持要用OpenGL,也可以用折衷的办法,选择安装NVB Exporter插件把场景导出为让CgFX Viewer识别的.nvb文件格式,在CgFX Viewer里进行实时的浏览,在处理复杂模型、场景的时候,这样的效率依然要比渲染更高得多。
安装完成后,打开你想编辑的模型或者场景文件(.max文件),按“M”键激活材质编辑器(Material Editor)。
在Material Editor中拉出Viewport Manager,可以看到其中的下拉菜单有CgFX选择。
选中CgFX后,点选旁边的Enable。
这时你会看到使用default.fx效果的模型是黑漆漆的,我们得更改应用的CgFx Shader。
激活CgFX Viewport
打开Cg FX Connection Editor
Cg FX Connection Editor
点击“File”,进入CgFX 3ds max Plugin目录中,你可以看到很多.fx后缀文件名,选择其中的一个文件,立刻就可以看到新的效果了。
CgFX是一种文件格式,类似于微软DX9 HLSL语言的.fx文件,定义了一个shader中可以编辑的参数,例如同一个场景的两个对象可以用同一个shader但是可以实现不同的效果。其中可以包容多种的shader技术,例如提供较高版本的shader(Pixle Shader 2.0)以及较低版本的shader(Pixel Shader 1.1)选择。此外,同一个CgFX文件还可以不同语言编写的shader,例如Cg高级语言、汇编语言以及特定硬件的机器代码等。
在Cg FX Connection Editor里还可以通过diffuseMaterial、lightPos等栏直接修改Cg的色彩、光照、环境贴图的材质等参数。
我们甚至可以直接修改Cg FX的源代码
除了nVIDIA Cg Plug-in for 3ds max 5.1自带提供的CgFX shader外,你还可以在http://www.cgshaders.org/shaders/找到更多更加丰富的CgFX shader库,参考大家的代码,编写出适用于自己作品的CgFX shader。
Cg for Maya
许多CgFX文件的代码是按Microsoft Direct X规范编写的,而Maya只使用OpenGL,但这些Cg shaders仍然可以作用于Maya---Cg会隐藏在后台执行任何需要调用的Direct X指令。所以在安装http://developer.nvidia.com/view.asp?IO=mayacgplugin target=_blank>http://developer.nvidia.com/view.asp?IO=mayacgplugin Cg Plug-in for Maya之前,我们同样需要安装DX8.1以上版本,硬件支持DX8.1以上的GPU,要得到最多的效果,最好当然是DX9和NV30了,另外Maya 4.5版本也是不可少的。
安装后,运行Maya,到主菜单下的Windows->Preferences->Plugin Manager...找到Cg plugin,选中启动时载入。
载入Cg plugin
Cg Plug-in for Maya
再选中要应用Cg shader的三角形模型,到主菜单中选择“Lighting/Shading,” -> “Assign New Material,” -> “Cg Shader.”,打开属性编辑窗口,找到你所需的CgFX文件,载入即可得到实时的效果。
load a CgFX file
最后,我们同样可以在属性编辑窗口对CgFX的色彩、光照等参数进行调整。
CgFX Viewer也同样适用于Maya。
CgFX Viewer
不难发现,CgFX的特性以及它在DCC领域的应用还将对游戏开发等领域带来新的变革。
传统的开发途径
应用FX的开发途径
上面两张图很清楚的表明了这一点,传统的3D游戏开发需要程序员针对不同的硬件平台编写不同的代码并进行封装,而现在我们只要通过共享的FX文件就可以传递特效;以前的美工因为在DCC工具里因为没有实时渲染,设计意图到游戏中往往大打折扣,而现在,我们可以在DCC设计与游戏中得到同样的画面。
【HLSL】
在介绍Cg和RenderMonkey的同时,有必要说一下微软的HLSL---high level shading languages,即高端着色语言。
HLSL是包括Cg在内的shader语言的标准。(我们需要一套标准的HLSL,且需广为API应用程序编程接口及显卡制造商所支持。但目前,我们只有一种选择─Cg,nVIDIA已公开表示Cg将与DX9 HLSL兼容。在这个基础之上,nVIDIA已积极推展希望将Cg变成业界标准,并宣称所有的显卡制造商都能参与其中。到时候,Cg可能就成了DX9及OpenGL所共选用的HLSL。)
HLSL相对于顶点着色/像素着色引擎用的汇编语言,就像是C语言相对于中央处理器用的汇编语言一般。与汇编语言相比,HLSL版本将会易为人类所阅读,这项优势亦将带来更少的程序错误以及更容易维护及编辑。
在微软最新发布的DirectX 9.0 Software Development Kit (SDK)中已经包括了HLSL。
虽然HLSL是设计VS/ PS效果极方便的方法,它仍无法克服在硬件上先天所具有的限制。更重要的是,使用HLSL的程序设计师必须要知道他们所将撰写软件的硬件平台为何,并要对于该系列产品在硬件上的限制先有通透的了解才行。
CgFX文件解决了这一个问题。
典型的HLSL代码例子
DX9 SDK的组件之一EffectEdit
【RenderMonkey篇】
与nVIDIA的Cg语言截然不同,RenderMonkey---The RenderMonkey Integrated Development Environment (IDE) 则是一套完整的材质处理研发工具。
如果你是一位程序员,已经有了Microsoft DirecX9.0 SDK,那么ATi全新的DirectX 9 Beta v0.9版RenderMonkey工具套装会成为你开发DirectX 9.0游戏的得力工具。http://mirror.ati.com/developer/sdk/radeonSDK/html/Tools/RenderMonkey.html。它的界面与Visual Studio GUI界面相近,Visual Studio程序员可以很快上手;自带Vertex和Pixel shaders编辑器,完整的支持微软Shader编译器;支持各种DX8, DX9 Shader模型(现在)和OpenGL Shader模型(未来)。
安装RenderMonkey前必须安装有Microsoft DirecX9.0 SDK
RenderMonkey
运行RenderMonkey我们可以看到,在画面左边是工作区,显示了所有已被研发的组件与材质。每个材质的每次处理都有数个区段。每次处理包含有要应用效果的几何、每一个顶点着色引擎与像素着色引擎、着色贴图状态、以及任何处理必需的参数或变量。参数包含有这项素材需用的材质及色彩。
在其右边,有效果窗口,让开发者可以检视所修改的效果。下一个窗口显示处理程序0中所用的顶点着色引擎与像素着色引擎以及放置于其上的常数。通过修改程序并重新编译,设计者可以立刻看到其修改的结果。
在下方则是输出窗口,让开发者可以看到编译结果是否有任何程序错误。
在工作区点右键可以增加模型(3ds格式)、材质物体、PS、VS特效等
PS编辑窗口,可以使用PS1.1到2.0版本
在编辑的同时,可以在预览输出窗口实时动态的察看效果。
RenderMonkey软件是一个允许程序设计师与美工人员创造新材质及编辑现有材质的开发环境。
预览输出窗口
【写在最后】
GPU生产厂商给我们提供了最佳的shader制作工具,但他们最终的目的是为了通过这些工具在残酷的市场竞争中获得更多的支持,从而占据更有利的地位,没有任何一家厂商希望看到竞争对手的产品成为业界标准,所以硬件兼容性将是未来shader工具不得不引起重视的问题。
虽然Cg在设计之初就考虑了最大限度的兼容性,它可以通过DirectX、OpenGL甚至绕过它们,但实际使用中它还是做出了种种限制。比如前不久发布的Cg游戏Gun Metal就无法在硬件支持DX9 shader2.0的ATi Radeon9500/9700上运行,这些用户不得不借助于3d Analyze的帮助来玩DX9 shader特效的游戏。
在OpenGL上,Cg同样如此,只有完全符合nVIDIA制定的OpenGL扩展指令集的驱动才能展示Cg制作的OpenGL shader特效。
错误信息
如果你是 Radeon95/9700用户在http://www.idvinc.com/html/downloads_exe.htm下载运行用Cg语言编写特效的IDV SpeedTree Demo,就只能得到上述的错误信息。
IDV SpeedTree Demo
包括前面我们提到的Cg Plug-in for 3ds max 5.1,即使你是硬件支持DX9的ATi Radeon9500/9700的用户,也只能接受下面检测nv*.*文件失败,Dll文件无法加载的信息。Cg在ATi显卡上有太多的问题,这与nVIDIA公开宣称的兼容性极为不符。
不难看出,Cg与RenderMonkey仍然还有一定的局限性,随着硬件和API的不断变更,它们还需要不断的升级,加入新的功能。
希望Cg与RenderMonkey在未来能带给我们更多的惊喜。
希望Cg与RenderMonkey能带领更多GPU用户进入shader的世界。
注:如果条件允许,近期我们还将会推出深入Cg图形编程的文章。
阅读更多:默认
相关阅读: