http://news.mydrivers.com/1/15/15020_all.htmhtml
【前言】git
您可能尚未意识到---您手头的这块显卡(或者说这块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而疯狂编辑器
在DX八、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图形编程的文章。
阅读更多:默认
相关阅读: