渲染簡介
在2002年,顯示卡的性能得到了極大的發展,首先是AGP8X在
顯示卡接口上的引入,使得顯示卡和處理器在數據傳輸的頻寬上得到了成倍的增加,達到了2.1Gb/s,此外,一些3D性能極其強大的
GPU也隨著顯示卡巨頭ATI和nVIDIA的競爭不斷被發布,如ATI的Radeon9700 pro以及NVIDA的Geforce FX,都支持微軟最新一代DirectX 9.0。其中,NVIDIA的Geforce FX更是由於CineFX架構的採用,號稱可以支持實時渲染,那么實時渲染對於我們的套用會產生什麼影響呢?實時渲染的時代真的要來了嗎?
渲染種類
格線渲染
頂點屬性只包含位置和顏色,頂點運算只包括對頂點位置的簡單變換、頂點的裁剪和投影,
光柵化處理中對頂點顏色也只進行了簡單的內插,像素運算則很簡單——覆蓋。渲染技術發展到第二代(1987~1992年)
陰影渲染
頂點屬性中增加了法向,用來進行光照計算。第二代渲染技術中引進了一個很重要的概念——深度,典型的套用就是深度緩衝。在
光柵化處理中還增加了深度內插。像素運算中增加了
顏色混合技術。第二代渲染技術豐富了畫面的色彩感和層次感,但整個畫面看起來還是很單調。第三代渲染技術解決了這一問題(1992~2000年)——紋理
貼圖,頂點屬性中又增加了紋理坐標,頂點運算中也相應地增加了紋理坐標的變換和內插。光柵化處理中增加了紋理坐標內插。像素運算中增加了紋理定址和混合以及
反鋸齒等技術。第三代渲染技術讓畫面更加絢麗多彩。隨著圖形處理技術的飛速發展,早期的固定函式
渲染管線已經不能滿足圖形開發人員的要求,他們需要圖形處理過程中更大的自由度。第四代渲染技術產生了(2000年後)——可程式渲染。在第四代渲染技術中,圖形開發人員可以對渲染管線中的頂點運算和像素運算分別進行編程處理了,而無須象以前那樣套用一些固定函式。比如,對於
頂點渲染,你不僅僅能簡單套用SetTransform方法實現頂點位置的變換,更為靈活的是,你可以通過編寫程式(
彙編程式或高級語言程式),實現頂點位置的更為複雜的變換;在光照計算中,你可以從最基本的光照模型出發,編寫程式分別計算漫射、高光、折射、散射等,更重要的是,你還可以將計算結果作為像素渲染程式的輸入,以實現各種豐富的效果。在像素渲染中,除了煩瑣調用大量固定函式來實現外,你還可以編寫程式,從外部或者上游獲取參數和紋理資源,進行像素渲染運算。像素渲染需要的運算量遠遠大於
頂點渲染,但輸出畫面的質量卻很高。許多高質量的畫面都是用
像素渲染代替頂點渲染獲得的。
談到可程式渲染,那就必然要談到程式語言。早期對
圖形處理器的編程採用Vertex Shader和Pixel Shader——它們一種類似
彙編語言的程式語言,編寫工作量大。隨著圖形硬體的發展,圖形處理器所能處理的指令數快速增長,採用類似彙編的方式進行編程的工作量達到了讓人不能接受的地步,於是用於圖形處理器編程的高級語言誕生了。
Cg語言就是其中的一個。Cg語言是nVIDIA公司與微軟合作進行
HLSL語言的研發過程中,nVIDIA公司開發的一個副產品。兩者從本質上是一樣的。為使得自己的產品更有通用性,
nVIDIA的Cg語言是
跨平台和跨API的。關於HLSL的介紹很多,這裡就以Cg語言為例介紹一下可程式渲染。
Cg即C for Graphic,意即用於圖形處理的C語言。其語法結構類似於C語言,但所有指令卻是由GPU來執行的。C語言的指令都是由CPU來執行的。以C語言為基礎,Cg針對
GPU的特點進行了改進和最佳化。配合
Cg語言的發布,nVIDIA提供了一套完整的工具包,其中主要包括:Cg用戶手冊、Cg語言
編譯器、Cg標準庫、Cg
運行時庫、Cg瀏覽器等。用戶手冊向開發人員提供了有關Cg語言使用的詳細說明;編譯器允許你先將
程式編譯輸出為彙編代碼,直接供應用程式調用;Cg標準庫非常類似於C語言的標準庫,大大簡化了編程,Cg標準庫包括數學函式、幾何函式、
紋理映射函式以及一些導出函式等;Cg運行時庫允許應用程式在運行時編譯和連線Cg程式,運行時庫包括核心
運行庫和API相關運行庫兩種;Cg瀏覽器方便開發者瀏覽nVIDIA公司提供的渲染實例效果。nVIDIA公司同樣支持微軟的.fx檔案。FX檔案中封裝了渲染指令和渲染狀態。針對FX檔案同樣有
運行時庫支持。
nVIDIA為DCC們提供了一個
外掛程式,該外掛程式調用FX檔案,使得模型
離線渲染的效果與運行時渲染的結果保持一致。
nVIDIA在
Cg語言中提出了一個Profile的概念,不同的Profile決定了Cg程式在編譯時其中的某些語法、控制指令、標準庫函式、數據精度等是否被支持。從這一點上來講,Profile似乎翻譯成“版本”比較合適。如果這個“版本”被硬體所支持,Cg程式才可能得以正常執行。Cg支持所有當前硬體支持的Profile。這一點與
HLSL不同,微軟允許軟體模擬——即由CPU去模擬本應由GPU完成的渲染任務。所以HLSL中允許軟體渲染的Vertex Shader和Pixel Shader版本超過硬體所支持的版本。另一方面,由於Cg支持跨API,所以Cg還支持OpenGL 各個版本的Vertex Program Profile和Fragment Program Profile, HLSL則只支持DirectX Vertex Shader和Pixel Shader。
在討論可程式GPU時,為什麼要將Vertex Program和Fragment Program分開呢。與CPU只是一個處理器不同,GPU內部包含兩個處理器——頂點處理器和像素處理器,同時還包括一些不可程式的硬體單元(用於固定函式管線渲染)。所以對CPU進行編程只需要一個
C程式,而對GPU進行編程則需要兩種程式:Vertex Program對頂點處理器進行編程,而Fragment Program對像素處理器進行編程。當然,對頂點處理和像素處理部分也可以選擇固定函式管線處理。
Cg語言可以完美地實現Cg程式與固定函式管線的完美結合。
可程式渲染技術的發展,對
遊戲引擎中渲染部分的開發也產生了深遠的影響。一般地,我們可以通過兩種途徑實現遊戲中的渲染效果。第一,渲染效果在關卡設計過程中由設計人員靈活實現。這主要是得益於.FX檔案。這樣做的好處顯而易見,設計人員有了更大的自由度和發揮空間,而且所設計出來的場景與實際運行時的效果保持一致。採用這一途徑需要注意避免頻繁地切換渲染程式導致渲染
幀率的降低。第二,從預先製作好的渲染效果庫中選取遊戲所需要的。這需要程式設計人員添加必要的C++代碼引用這些渲染
程式模組。一般情況下,程式設計師還需要將渲染程式中的相關參數編碼到模型(頂點)或紋理中去,以有效提高渲染速率。採用這種方式,程式設計人員就可以比較有針對性地避免渲染程式的頻繁切換,以確保遊戲運行時的幀率。當然,一旦引擎確定,可得到的渲染效果庫也就確定了。不同的遊戲類型,不同的遊戲,對兩種渲染途徑的要求也不同。這些都需要我們在設計
遊戲引擎時進行分析和考慮的。
隨著相關產業對圖形處理要求的不斷提高,
圖形處理器將朝著兩個方向發展:更快的
運算速度和更加自由的可程式性。硬體速度的提高,也將不斷催生出一些新的渲染技術,同時也使得一些在目前的硬體平台上難以實現的渲染技術變為可能。光照計算所需要的運算量很大,在目前還只能通過各種間接的途徑模擬實現。可以預見,在下一代的實時渲染技術中,例如
光線追蹤、真陰影等技術或許將變為可能。這些技術的實現,將使得圖形渲染效果變得更為真實。高度真實是實時渲染技術未來發展的一大特徵。硬體可程式度的提高,使得設計人員對硬體的控制將變得更為靈活和富有創造性。可程式將是未來渲染技術發展的又一大特徵。
nVIDIA在力推其新一代
圖形處理器及
Cg語言的同時提出了一個Cinematic Render的概念,將實時渲染提到了一個全新的高度。
實時渲染技術從誕生的那一天起就不斷地推動著遊戲產業的發展,相信也將繼續影響下去。