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圖形編程的文章。
閱讀更多:默認
相關閱讀: