在1995年時,由一家專門製造顯示卡與GPU的公司(3dfx)推出了第一個具有3D加速的繪圖晶片卡-Voodoo,如圖一,就此電腦繪圖產生了重大的改變。Voodoo雖然有繪圖上的一些限制,但它允許程式設計者從一個新的角度-硬體上去解決繪圖的問題,而不像從前只能從軟體上去著手改善。由於這張繪圖晶片卡的產生,也實現了即時的3D繪圖,讓遊戲更加的寫實逼真。
圖一 3Dfx Voodoo 顯示卡
雖然繪圖卡在之後不斷的提升其效能與特性,但是程式設計師還是受限於其固定的管線流程。由Pixar Animation Studio所研發的RenderMan,是一套著色語言(shading language)工具,透過簡單與強大的程式語言功能,賦予美術與程式設計師可以充份的掌握繪圖結果。RenderMan可以創造出高品質、更寫實的圖片,其也使用在現今許多的電影特效後製上,如玩具總動員與蟲蟲危機!唯一需要注意的是RenderMan的複雜性與它並不支援即時的繪圖,但相對的它對電影CG的美術而言,給予了全面性的掌握與操控性。
隨著處理器(processor)的發展,伴隨而來的是處理效率的大量提升,自然而然的將RenderMan的概念導引延伸到客戶階層的繪圖硬體上。DirectX 8.0的釋出介紹了頂點著色(vertex shader)與像素著色(pixel shader) 1.0及1.1的版本,這是美術與程式人員的第一步可以彈性的產出絕色與真實的圖片。往後的幾年,繪圖卡硬體和3D應用程式介面(APIs)在功能與效能上有巨大的躍進,DirectX 9.0的釋出以及最新的顯示卡硬體,如NVIDIA GeForce FX系列或ATI Radeon 9800系列的顯示卡技術,可以處理頂點著色與像素著色2.0與2.X版本。
著色語言(shadinglanguage)簡單的來說就是程式人員可以透過某些應用程式介面(API),如DirectX或OpenGL,操作繪圖顯示卡上的記憶體進行運算,但目前顯示卡的可程式化是機密,僅能透過API所提供的介面對其進行操作,如上述提到的頂點著色(vertex shader)與像素著色(pixel shader)介面。下面我們將詳細的介紹頂點著色與像素著色的操作與運作。
頂點著色器(vertex shader): 此資料串流(data stream),如下圖二所示,包括所有幾何圖形所需處理的資料,如位置、顏色與材質資訊等,主要可分為4個暫存器。
(1). Input data暫存器,每一個頂點(vertex)都可以獨立地被處理且可 將資料存放在v0~v15的這16個暫存器中。
(2). Constant暫存器,這個指供讀取,不能寫入,是必須提前設定的, 負責儲存靜態的資料,在2.0版本中,此暫存器已經可以處理向量、浮點數、 整數與布林值等運算。
(3). Temporary暫存器,主要負責儲存中間計算的結果,a0~aL比較特別, 這幾個是計數暫存器,負責持續追蹤迴圈的。
(4). Output暫存器,其中oPos暫存空間,負責儲存最後要投射到螢幕上 的最後位置資訊,其他暫存空間則負責儲存如最終的顏色與材質等資訊, 最終將資料輸出並光柵化(Rasterization)。
圖二 Vexter shader 資料處理架構
像素著色器(pixel shader): 此資料串流(data stream),如下圖三所示,主要是負責光柵化後的像素顏色的計算,主要是透過(1)與(2)的暫存器,下面可以分為如下面6個暫存器。
(1). Input data暫存器,vo與v1暫存空間主要負責內插計算漫射 (diffuse)與反射(specular)光,
(2). Texture暫存器,t0~t1暫存空間,主要負責內插材質的uv坐標值。
(3). Temporary暫存器,主要是設計的考量,與(2)都是可供寫入與讀取 的暫存空間,目的是為了讓程式設計師也可以利用(3)讀取資料再將資料寫 入(2)中。
(4). Sampler暫存器,s0~sN指向(2),在像素處理的過程可以將之樣品 (Sample)化,此暫存空間負責儲存所有從頂點著色(vexter shader)輸出的 資訊。
(5). Constant暫存器,這個指供讀取,不能寫入,是必須提前設定的。
(6). Output暫存器,oC0與oDepth暫存空間的資訊會在最後繪圖時,決 定螢幕上最終像素顏色時被使用,其儲存最後的顏色、霧面和深度等資訊, 最後的輸出資訊可以被使用在混色(blend)並存入繪圖的暫存空間(frame buffer)內,等待被繪在螢幕上。
圖三 Pixel shader 資料處理架構
這些新的著色模型帶來新的彈性與技術在即時繪圖的應用發展上,像是支援流程控制操作,如迴圈,以及提供更多的固定與臨時的暫存器。學習如何動手撰寫自己的著色語言程式,此書將會使用由ATI開發的RenderMonkey為主要工具,RenderMonkey也是一套著色語言工具,其提供一個簡單的圖像使用者介面,如圖四。
圖四 RenderMonkey介面
除了RenderMonkey外,我們還需要其他的輔助工具,如Microsoft開發的Texture tool,如圖五,這也是一個簡單但功能強大的編輯工具,其支援32位元的浮點運算、可以改變材質的格式、產生環境貼圖(cub-map) 、容積材質(volume texture)並可輸出.DSS格式的材質。
圖五 Microsoft Texture tool
由於.DSS格式是RenderMonkey使用的最原始格式,所以我們會需要可以編輯.DSS格式的工具,除了Texture tool外,還可以使用NVIDIA所推出的Photoshop Plug-in,如圖六,其提供更多對.DSS格式檔案的編輯功能,但相對的Photoshop價格比較昂貴,成本比較高。
圖六 NVIDIA's Photoshop plug-in 部分介面
上述的是材質的編輯,當然我們也可能對多邊形進行編輯,RenderMonkey支援3DS與.X格式的檔案,所以我們會需要可以輸出此格式檔案的軟體-Discreet 3D Studio MAX,如圖七,其簡單又富彈性,所以被許多遊戲製作者所使用,但價格也較昂貴。Discreet有發開另一套免費的軟體-Gmax,以3DSMAX為基礎架構所研發的3D模型開發工具,主要是提供遊戲開發團與愛好者方便修改遊戲中人物、武器造型等。
圖七 3DSMAX 操作介面
另一個由Microsoft所開發的著色語言工具-Effect Edit,如圖八,跟RenderMonkey很類似,也是提供一個簡單的架構去編輯著色語言。但此工具較適合進階的DirectX 發展者,所以本書還是會以RenderMonkey為主要的學習工具。
圖八 Microsoft Effect Edit