http://www.opengpu.org/forum.php?mod=viewthread&tid=7550&extra=page%3D1
本文取自西川善司的3D圖形技術連載,全99回
本貼為9~13回,爭取每1~2天更新一回吧。半年更新完。
也希望大家能支援。
翻譯 Trace
校對&註解 千裡馬肝
3D圖形的概念和渲染管線(Render Pipeline)
前面介紹了3D圖形曆史,接下來要解說的是3D圖形的處理流程。
3D圖形管線的流程圖
圖1是3D圖形的流程模型。這個雖然是對應DirectX 10/SM4的GPU流程模型,不過部分流程會根據GPU的不同,有時會有更細緻的處理,有時也會做一些簡略,這點敬請諒解。
首先,介紹一下3D圖形的處理為什麼會變成這樣的根本原因。會變成這個樣子,是由於在漫長又短暫的即時3D圖形曆史中,這個部分需要進行最順暢的處理,更重要的是因為這樣設計GPU會更容易實現的原因。這個流程不管是在Direct3D還是在OpenGL裡都沒有太大的差異。
圖1 GPU內部的渲染流程
CPU負責的3D圖形處理部分 = 遊戲引擎?
圖1的[1]和[2]的部分,主要是在CPU裡進行的處理。
配置3D物體或是移動後再設定,因為這兩種很類似,所以把這些在系統中處理的部分全部稱作[遊戲引擎]。
在遊戲引擎中,遵從鍵盤輸入、滑鼠輸入、遊戲控制輸入讓3D角色移動,或是進行開槍擊中敵人的命中時的碰撞檢測,根據碰撞的結果,雖然要進行把3D角色們擊飛的物理類比,但這些是遊戲邏輯的部分,某種意味上,是和[1][2]相同的部分。
另外,在[2]中如果有對應DirectX 10/SM4.0的GPU,要是能利用Geometry Shader,那麼也可以在GPU上進行了,例如關於particle或billboard這樣的point sprite,把建立和銷毀用Geometry Shader來處理,就可以實現讓GPU介入的處理。雖然如此,一般的3D遊戲處理中,這部分還是由CPU來處理的部分。
Vertex Pipeline和Vertex Shader的座標系是什嗎?
圖中紅線的[3][4][5][6]的部分,是進行頂點相關處理的頂點管線。
通常從這裡開始是在GPU內部進行處理的部分。但是,為了簡化內部邏輯以降低成本,所以要讓圖形機能整合,就是所謂的[統一晶片集],把這個頂點管線轉移到CPU的(模擬)系統也是存在的。
那麼,直到稍早之前,很多時候把這個頂點管線稱為[幾何體處理]。所謂幾何體(Geometry)就是是[幾何學]。在高中,雖然就會在數學或是[代數•幾何]的課程中,學到[向量(Vector)運算]和[線性映射(Linear Map)或線性變換(Linear Transformation)],不過這就是那個世界的事了。說句閑話,NVIDIA的GPU,GeForce系列的名字是由「Geometric Force(幾何學的力量)」的縮寫所造的名詞,可以說有著[G-Force重力]的雙關語。
把話題轉回來,說回3D圖形上的[3次元向量]的概念,簡單而言想成是[三次元空間上的”方向”]就可以了。這些”方向”被x,y,z的3個軸的座標值來表示,以這些”方向”為基準的被稱之為[座標系]。
「局部座標系」,如果具體的描述就是對於某個3D角色來說,設定為基準的座標系,3D角色的方向就是這個3D角色的基準座標系,通過處理[朝向是哪裡],控制的人會很輕鬆,所以利用了局部座標系這個概念。
對了,一般的3D角色上雖然有很多是帶有手臂和腳,考慮到那些手腳在關節處彎曲的情況,如果用關節為基準的局部座標系進行控制會更容易理解,但是這樣考慮的話,就要把局部座標系做成多層的結構,最終的處理會變得不容易理解。
接下來,支配3D全域空間的整體座標系就很有必要了,這就是[全局座標系]。在處理3D圖形的頂點管線中的頂點單位時,從局部座標系向全局座標系的變換會多次發生。
這樣產生的頂點要根據shader程式進行座標系的變換處理,就是[3][頂點著色語言][Vertex Shader]。通過著色器編程,就可以進行獨特而特殊的座標系變換。
圖2 座標系的概念圖