3D繪圖(3D Graphics Pipeline)
3D繪圖(3D Graphics Pipeline)
3D繪圖(3D Graphics Pipeline )
著於民國玖拾陸年叁月叁日
民國臺灣臺南市
1 前言
3D,顧名思義是三維的繪圖,相對於2D繪圖來比較的話,3D繪圖提供作畫者在三維空間中表現的自由度。但是我們的螢幕是一個2D的平面,因此所有的3D繪圖都脫離不了一個核心-「投影」(Projection)。
在真實世界中,有各式各樣的物體,當我們透過一個窗框看出去,事實上就是看到了世界在窗框上的投影(在這裡我們先不考慮立體視覺,請想像你只有一隻眼睛)。3D繪圖就是類似的感覺,作畫者在三維的空間(稱作場景,Scene)中繪出許多物件,經過3D繪圖技術的演算,成為我們在螢幕上所看到的畫面。
要做一個投影,需要知道一些資訊,首先是攝影機(camera,或eye point)的位置,攝影機朝向的方向,攝影機的視角(包含上下與左右的開展角度),攝影機的「上向量」(upvector),近平面(near),遠平面(far)。有了這些資訊,我們定義出了一個「投影」,來說明如何將一個3D Scene投影到一個矩形的平面上。所有的3D繪圖技術,講得簡單些,都是在做這個投影而已。
如何表現一個場景?
現在我們知道,場景是一個三維的空間,而我們的計算機是個處理數位資料的機器,那麼,如何將一個三維空間中的繪圖資料用數位的資料記錄下來呢?其中的一個方法是使用頂點(Vertex)組成網眼(Mesh)架構,來記錄三維的資料。注意我說是「其中一個」方法,意思就是你也可以選擇用各種參數方程式來表達一個曲面,從而表現整個場景,但是今日的技術主流是使用Vertex。
一個Vertex可以帶有許多資料,稱作屬性(Attribute),比如說該點在空間座標系中的座標(Coordinate)、法向量 (Normal)、該點的顏色(Color)、紋理座標(Texture coord.)Vertex同時也可以作為貝茲曲面(Bezier surface)或NURBS曲面的control point。因此我們用Vertex來表達一個三維的空間。當我使用越多的Vertex,意味著帶有越多的資訊,就可以把圖形表現得越細緻,當然,這不是必然的,卻有很大程度的正相關性。
有了頂點,我們必需知道這些頂點如何組成一個3D場景中的物件,也就是說,哪些頂點組成了一個面、哪些面又組成了一個物體。由頂點(Vertex)組成的結構稱為Mesh,想像許多的頂點由線連結起來,形成一個類似魚網狀的圖形,這是為什麼它稱為Mesh的理由。這些線條說明了Vertex如何連結成為 Mesh,我們稱作Primitive,注意Primitive並不是線條而是一個抽像的連結概念,在這裡我只是為了解釋方便而形容它像是線條。最簡單的 Primitive有三種,點、線、三角形。而這就是全部了,因為所有的多邊形都可以拆成三角形,關於這方面我會在之後討論硬體時再詳細的說明。
於是Vertex與Primitive組成了一個3D scene,而3D繪圖技術的主要工作,便是如何將這些Vertex與Primitive的資料,轉換成螢幕上一個一個點的顏色。這些顏色由紅藍綠 (RGB)組成,根據其色彩深度(color depth),每個點可能從8bit到32bit之類有不同的資料大小。但總而言之是個數位(Digital)資料,從一組數位資料(Vertex與 Primitive)運算出另一組數位資料(例如 1024*768,32bit depth color),正是計算機領域的主題。
2 三維繪圖:Rendering
Rendering,Render,這兩個單字實在有太多的中文翻譯,有稱之為算圖、繪製、著色演算…等許許多多說法,所以我傾向使用原文來說明。Render的原義指的是「表現、表演、繪制」等等許多意思,意即是如何表現出一個主題的過程。而在3D繪圖中我們理解為「由Scene投影到screen,決定顏色」的過程。在3DComputer Graphics領域中的兩個主題:Modeling與Rendering,分別是決定了從虛擬的場景概念到Vertex與Mesh,以及從Vertex 與Mesh到螢幕上的pixel color這兩個階段。
2.1 那麼,怎麼做Rendering呢?
第一種技術,很直覺的我們想到模擬眼睛的投影模式。因為有光進入眼睛所以產生了顏色,這個光是符合光學理論,隨著各種反射、折射、散射,經過了各種物體的吸收、反射等等過程,最後進入我們的眼睛。於是我們反過來看,當我要計算螢幕上一個點的顏色時,從投影點(Camera)連到該像素的位置,成為一個向量 (vector)。記得嗎?在上一篇我們提到已知投影點的位置,也就 是在空間座標系中的座標、以及一個在空間中抽像的投影矩形(事實上它就是近平面near),也就是對應到螢幕的矩形。根據兩者我們便知道在空間座標系中,從投影點到像素的向量,我們把這個稱作一條Ray。
延著這條Ray看過去,直到撞到一個物體--我並不打算在「淺論」中談論過多的數學方法,因此我會省略大部份的演算而只講一個概念,雖然只提概念會有些事情沒辦法解釋得清楚,但我會儘量說明。
當視線(ray)撞到一個物體的某個面,這個面對於光會有許多種屬性反應,這些資料或者記錄在形成這個面的三個Vertex上,或者記錄在其他全域變數裡。總而言之,我們可以知道被視線(ray)所撞到的這個面,會使得ray產生怎麼樣的變化。我們從法向量(Normal)算出反射與折射,於是得到了新的ray,再度沿著這些新的ray走下去。
因此我們提到的這個Rendering方式,概念上就是沿著光線到達投影面上的點的路徑反推回去,根據一路上碰到的物體或光源來得知該點的顏色。
這個方法就是所謂的Ray-tracing。
第二個技術稍微複雜一點,稱作Radiosity,這是一個基於輻射的光照演算法。首先,將每個surface分解為patch(因為計算上的理由,要將較大的surface分解為具有固定的max-size的patch)。每個patch都有一個光照圖(lightmap)來表示patch上光照的分佈。接著根據環境光源來設定每個patch上的光照初始值,接著進行
- 從每個patch上的光照值算出應該輻射出去的光照,搜尋過所有從這個patch可見的其他patch,根據這個patch輻射出的光照值來計算其他patch會接收到的新光照值
. - 若是某個patch需要輻射的能量小於某個事先定下的threshold(不設threshold的話,這演算法會跑不完),則這個patch就不用再運算下去。否則,重覆第一步驟直到所有patch應該輻射的能量都小於threshold。
從概念上來說,Radiosity算法,就是實際的計算光源對於整個場景的影響,計算出整個場景的光照之後再根據算好的光影效果繪製到畫面上。在這裡繪製的方法一樣是類似ray-tracing,從每個pixel對應的ray去檢查究竟看到的是場景中的哪個面。差別是不用再沿著反射ray或折射ray追蹤下去,因為光照的效果已經由Radiosity計算好了。
第三個技術,稱作Rasterizing(光柵化)。Rasterize指的是由Vector graphics(向量圖形)轉換為Raster graphics(光柵圖形)的過程。
首先我們來了解這兩個名詞:所謂的光柵圖形,就是由像素(Pixel)緊密排列形成的圖形,也就是我們在螢幕上看到的形式,所謂的「點陣圖」。而向量圖形,是由幾何模型(Geometry Model)所組成的圖形。
舉例來說,在白色畫面上有一個紅色的圓。光柵圖形的表現方式就是用紅色與白色的像素排列出一個圓形,而向量圖形的表現方式是決定圓心、半徑、圓的顏色,來表示一個圓。 而我們之前所提到的Vertex與Mesh這個結構,便是一種向量圖形。但是這個向量圖形中只有點、線與三角形三種基本的Geometry Model。因此我們要以光柵圖形顯示在螢幕上時,便要對向量圖形進行光柵化(Rasterizing)來得到光柵圖形。
Rasterizing的實作方法,最簡單的方式是scan-line,也就是對一個投影在平面上的三角形,水平檢查每個像素點來決定它是在三角形內,或者是三角形外。然後將三角形內的點都塗上三角形該有的顏色--這當然是很簡化的說法,在之後討論3D pipeline時會有更進一步的說明。
2.2 硬體加速
終於我們進入到標題中的其中一個主題,硬體加速。Hardware Acceleration說穿了就是將演算法設計成電路,以達到高速演算的目的。
因此我們要從上述的三種演算法中找一種適合以硬體做加速的演算法。而最後雀屏中選的演算法是 Rasterizing。Ray tracing和Radiocity的複雜度、分支度高,資料的locality又太低,大大提高了硬體加速的難度。相對的來說,Rasterizing 的演算法在這三方面都比前兩者好,雖然Ray-tracing和Radiocity在真實度(Realistic)上的優勢明顯,但是今日硬體的主流還是基於Rasterizing的3D pipeline架構。
在這裡我講的很簡略,也沒解釋其中的專有名詞,但是之所以Ray-tracing和Radiocity沒有成為硬體加速主流的原因可以是一串很長的討論,就像為什麼x86結構一開始選擇了CISC一樣。在這篇淺論中我不打算對這點深入的討論,只說出了結果:
Ray-tracing和Radiocity演算法至今仍多數在CPU上完成(雖然有些GPU based的做法,但是那並不是完整的演算法,而是去適應GPU硬體的演算法)。即時的ray-tracing(Real-time Ray-tracing, RTRT)能處理的場景複雜度仍然不高,而Radiosity就更不用說了。
3 繪圖流水綫(Rendering Pipeline)
–> Transformation & Lighting –> Viewport Transformation –>Clipping & culling –> Primitive Assembly & Triangle Setup –> Rasterization –> Pixel operation –> Raster operation
這是一個簡化過的Rendering pipeline,但是它包含了今日3D pipeline中的主要部件。為什麼稱作Pipeline呢?因為它就像個一條長長的流水線,輸入Vertex data,經過一個又一個Stage的轉換,最後輸出Pixel color。實際上的GPU pipeline高達數千至上萬個cycle,那是因為把整條流水線的運算拆到一個加法或一個乘法那麼細的部件來執行了。而我們在這裡從high- level去看這條流水線,說明每個Stage做了什麼事。
3.1 Transformation & Lighting
Transformation,在這裡指的是座標系的轉換,由物件座標系(object coordinate)轉換到全域座標系(World coordinate)再到視點座標系(eye coordinate)的過程。
Object coordinate —————————–> World coordinate ———————–> Eye coordinate
Model transformation View Transformation
所謂的物件座標系,指的是以物件參考點為原點的座標系。以一個正方體來說,在物件座標系上(以正方體中心為參考點),八個Vertex的座標分別是 (-1,-1,1) (1,-1,1)(1,1,1) (-1,1,1) (-1,-1,-1) (1,-1,-1) (1,1,-1) (-1,1,1)。
而所謂的全域座標系,是整個Scene的座標系,對所有場景中的物件而言都是同一個,以上例的正方體來說,若它的中心點在World coordinate中是(3,6,4),假設沒有旋轉,那麼8個Vertex在World coordinate上的座標分別是(2,5,5) (4,5,5) (4,7,5) (2,7,5)(2,5,3) (4,5,3) (4,7,3) (2,7,3)。
視點座標系,則是以視點為原點,視線方向為-Z軸的座標系。
因此我們將Vertex的座標,從物件座標系轉換到全域座標系的過程,稱作ModelTransformation。從全域座標系轉換到視點座標系,稱作 View Transformation。這包括了上面例子中的平移,以及旋轉、伸縮等線性變換。在數學上它是以一個HomogeneousCoordinate System的矩陣運算來達成,一個Vertex有四個座標值,表達成向量(x,y,z,w),乘上一個4×4的變換矩陣(Transformation Matrix)。
詳細的數學並不在我們的討論範圍內,但是請記住「4」這個數字,因為在之後的硬體討論上我們會需要用到它。
Transformation結束後是Lighting,根據Vertex上帶有的顏色(Color)與法向量(Normal),加上光源的方向,來進行光照計算,算出光照過後的顏色。注意原本的顏色更精確的說,是「對於光線的反射強度」。也就是說,就算原本的顏色是全紅,表現成RGBA顏色向量是 (1.0 ,0.0 ,0.0 ,1.0),如果沒有任何的光打到這個頂點上,則最後出來的顏色會是全黑(0.0 ,0.0 ,0.0 ,1.0)。
這裡提到了一個顏色向量的表示法,它把顏色當成一個向量來表示,其四個值分別代表了紅色 R,綠色 G,藍色 B,透明度 A。又是一個「4」。
3.2 Viewport Transformation & Clipping & Culling
光照完成之後,接著又是一個座標系的轉換,這次是從視點座標轉換到裁切座標系(Clip coordinate)再轉換到螢幕座標系(screen coordinate)的過程。
就像在前一個Stage的Transformation一樣,它們有如下的關係:
Eye coordinate —————————–> Clip coordinate ————————-> Screen coordinate
Projection transformation Viewport Transformation
Clip coordinate是將視點座標進行投影(Projection),還記得第一篇說的嗎?在Eye coordinate上,我們的原點就是攝影機,視線方向是-Z軸,加上視角與遠近平面,我們創建了一個梯形體的三維空間,近平面(也就是投影平面)是梯形體較小的矩形,遠平面是梯形體較大的矩形,而所有在這個梯形體的內的Vertex,就是我們在螢幕上會看見的Vertex。因此超出這個梯形體的場景,都被視點去除(Frustum Culling)掉了。
最後一步是將Clip coordinate的梯形體轉換為一個立方體,近平面(梯形體較小的矩形)就是對應到螢幕,其X Y座標就是螢幕像素的座標(左下角是0,0),Z座標則是代表畫面的深度(也就是該Vertex離投影面有多遠)。
為什麼我們在投影完之後還要留下Z座標的值呢?這是因為「Vertex離投影面的距離」可以用來處理三角面間相互遮蓋的情形,也就是哪個三角面在前,哪個三角面在後。這個稱作Z-buffer的技術會在之後提到。
3.3 Primitive Assembly & Triangle Setup
流水線進行到這邊,已經把與頂點(Vertex)相關的操作完成了,接下來進行的Primitive Assembly,顧名思義是將Vertex根據Primitive,還原出Mesh結構。還記得之前Primitive與Mesh的概念吧?在之前的流水線中是對於頂點的處理,在這個Stage中將Vertex連結起來,組成點、線、或三角形的單元。
之後,將超出螢幕外的三角面進行裁切(Clipping),想像一個三角形的其中一個頂點在畫面外,另外兩個頂點在畫面內。這時我們在螢幕上看到的就是一個四邊形了。因此我們把畫面外的部份去掉之後,再將剩下的四邊形切成兩個小三角形。此外,由三角形的頂點順序,根據右手定則(right-hand principle)來決定三角面哪一面是正面,哪一面是反面,進行背面去除(Back-face Culling)。
以上Clipping與Back-face Culling的部份,主要是為了減少處理的三角面數量,不會看到的三角面就不用進行處理。
於是我們得到了一堆三角面,準備拿去做光柵化(Rasterizing)。
這個步驟在處理三角形的時侯被稱作Triangle Setup。當然,Primitive也可以只是線(lines),那麼畫出來的圖形就沒有面,只有線框(wireframe)的圖形,但是這並不常見,一般來說三角形還是最常見的。
3.4 Rasterization
這個步驟就是之前提過的光柵化(Rasterizing)。 經過了之前許多的座標轉換之後,現在我們的Vertex座標是在Screen coordinate上了。一個三角形的三個Vertex的座標可能如下:
X Y Z
Vertex 0 (201.8 ,255.4 ,0.325)
Vertex 1 (240.5 ,260.3 ,0.400)
Vertex 2 (229.2 ,266.3 ,0.277)
X,Y座標的值不一定是整數,而Rasterizing可以理解為在找出三角形內部有哪些整數點的過程。因為這些整數點就代表了螢幕上的每個像素(Pixel)。Z軸的值通常是在0~1之間,是為了硬體的理由,方便Z-buffer以定點數來儲存。
之前說過,Rasterize最簡單的方法就是scan-line,先固定Y座標,對著X座標橫著搜查。再將Y座標往下一行,如掃瞄線般。但事實上今日的硬體在做Rasterize的時侯「Z字形」的去搜尋的。如下圖所示,每個數字代表一個整數點pixel被搜尋到的順序:
1 2 5 6 17 18 21 22 65 66 69 70
3 4 7 8 19 20 23 24 67 68
9 10 13 14 25 26 29 30
11 12 15 16 27 28 31 32
33 34 37 38
35 36 39 40
41 42
43 44
剩下的數字還有45~64都省略掉了,但是仔細看推敲一下相信不難懂。
這樣做的好處有很多,包括確保了資料的Locality、方便Supersample或Multisample的實作等等。這部份的出現的名詞稍微深入了一點,如果不懂也沒關係,因為不影響之後的章節。
Rasterize之後,我們把處理的對像從頂點(Vertex)變成了像素(Pixel)。以此為分界整個3D pipline在處理Vertex的部份被稱為前端(front-end),而處理像素的部份則是後端(back-end)。
3.5 Pixel Operation
Pixel operation雖然只有短短的兩行字,但其實包含了很多的操作在裡面。也許讀者們曾經聽過這樣的說法:近年來的3D繪圖發展,以Pixel Shader的發展為主。是的,這個Stage的能耐的確在這四五年來有長足的進展。所謂的Shader,我們會在之後有很大篇幅的討論,但是和這裡的 Pixel operation稍有不同。
Pixel operation最後的目的只有一件事:算出Pixel color,但是這中間包含了很多種計算顏色的方法以及技術。在目前介紹的固定式管線(Fixed pipeline)中,Pixel operation包含了哪些事呢?
- Texture operation
紋理操作,也就是根據Pixel的紋理座標,查詢相應的紋理(Texture),來計算Pixel該有的顏色。
. - Blending
混色,根據目前已經畫好的顏色,與現在正在算的顏色的透明度(Alpha),混合兩種顏色,當作新的顏色輸出。
. - Filtering
將正在算的顏色經過某種濾鏡(Filtering)後輸出。關於filtering的理論牽涉到數位訊號學,請暫時理解為,經過一種數學運算之後變成了新的顏色。
諸如此類的操作,都是屬於Pixel operation的範圍。但是我們還有一件事沒提到,那就是,像是紋理座標(Texture coordinate)或是現有的顏色、透明度之類的資料是怎麼來的呢?像素的 X,Y 座標是經由Rasterizing產生的,那 Z 座標呢?
答案是內插法(interpolation)。記得我們提過在Vertex上包含了許多資訊吧?這些資訊經過內插後變成了Pixel的數據。舉個例子,先來考慮一維,也就是只有X座標的情況
兩個Vertex的X座標分別是 1.8 、 4.5,而Rasterize後的Pixel 有三個:2 3 4。假設1.8的Vertex,其RGBA顏色向量是(1.0 ,0.0 ,0.5 ,1.0) 4.5的Vertex,其RGBA顏色向量是(0.0 ,0.8 ,0.5 ,1.0)。那麼 3這個Pixel的RGBA顏色向量,就是這兩者的線性內插值。以紅色(R)來說就是
1.0*(4.5-3) + 0.0*(3-1.8)
—————————– = 0.55555….
(4.5 - 1.8)
這個方法推廣到二維的X,Y座標上,則稱作雙線性內插(Bi-linear interpolation)
實際上,在硬體上的雙線性內插是透過Plane Equation來完成的,在Triangle Setup的階段,就對Vertex上需要做內插的每個Attribute都建立一個Plane equation。之後的線性內插就只是將Pixel座標代入所需Attribute的Plane equation的過程。這部份相關的數學我說得很簡略(深入淺出嘛),總之,因為在Pixel operation中,有大量的線性內插需求,所以在硬體上有專門的電路來處理快速內插的需求。
3.6 R aster operation (ROP)
在前一個Pixel operation的Stage中,我們最後得到了Pixel的顏色(RGBA)、深度(Z)等各種記錄在Pixel上的資訊。最後我們要決定要將什麼顏色輸出到Framebuffer上。
這裡提到了一個名詞:Framebuffer,它的意思是在輸出到螢幕之前,將目前Rendering的結果都存在一個緩衝記憶體(buffer)裡。等整個Frame都完成之後再輸出到螢幕上。通常我們透過雙重緩衝(Double-buffering)的技術,在兩個buffer之間切換。一個 buffer輸出到螢幕的同時,在另一個buffer裡Render下一個frame,完成之後就切換過來。
因此,Raster operation就是一個把Pixel顏色填進frame buffer的過程。例如下列的操作:
3.6.1 Scissor Test (剪切測試)
測試目前的Pixel X,Y座標是否在程式設計者指定的範圍內,比如 (10,10)到(20,20)的矩形之內。若否的話,直接將此Pixel忽略(Discard)掉而不改變framebuffer。
.
3.6.2 Alpha Test (透明度測試)
測試目前的Pixel Alpha值是否大於、小於、等於某個數值,由程式設計者指定該值與測試的方法。若沒通過測試,一樣將此Pixel Discard掉。
.
3.6.3 Depth & Stencil Test (深度與模版測試)
深度測試,是將目前depth-buffer(深度緩衝,可能有z-buffer及w-buffer)中的值與目前Pixel的Z值做比較,來測試目前的Pixel是在已經繪制好的圖片前方(靠近螢幕)或之後。一般來說若是在之後,則將Pixel discard掉,在前則繼續繪制,並把深度緩衝中的值更新為目前Pixel的深度。
.
從前的深度測試只有z-buffer,也只能做固定的測試。但是其實今日較為自由的Pipeline是允許程式設計者自由決定Depth-Test的行為的(就像Alpha Test一樣)。
.
Stencil Test與Depth-buffer類似,是將目前的Stencil-buffer與固定的值做測試若是通過測試則繼續下去,並將Stencil-buffer的值做某些改變。
一個簡單的例子:要將一塊圓形畫在一塊木板上,但是我希望圓形超出木板的部份不要被畫出來。那麼使用Stencil Test的做法就是:
- 先Render出木板,並在Render木板的同時將木板位置的的Stencil buffer設為 1
. - Render圓形在木板上,但是若是Stencil buffer不等於1,則將該Pixel Discard。若是Stencil buffer等於1,則繼續繪製並將Stencil buffer設回0
像這樣的形式,Stencil Test被運用在很多繪圖技巧上。最重要的運用例如陰影(Shadow)的繪製。使用Stencil Test可以將陰影均勻且正確的繪製到被陰影遮蓋的表面上。
Depth buffer的寬度通常是16bits~32bits,Stencil buffer是1~8bits。Depth buffer的寬度決定了深度測試的精確度。Stencil buffer的寬度決定其運用的自由度,越長的Stencil buffer可以表示越多種「狀態」,例如上面例子的0 1分別代表已經繪制過和尚未繪制過的狀態。
此外,從前的Depth buffer技術只有Z-buffer,Z-buffer有個問題是它對遠方的物體精確度較低,因此可能會出現前後關係判斷錯誤的情形。造成這個原因的主因,是Z值在Screen coordinate中做雙線性內插(前一篇提過的)然而在Eye coordinate到Screen coordinate的變換是個非線性的變換。這就造成在Eye coordinate上的Z值是非線性的變化。因此在近處與遠處的精確度就不一樣了。因此我們引入了w-buffer的概念,W值其實是Z的倒數,它在 Eye coordinate上是線性的變化。因此我們在Depth-Test中加入了w-buffer之後,就能夠處理z-buffer在遠處精確度不足的問題。
3.6.4Blending
混色,將目前的Pixel Color與framebuffer中已經繪制好的圖形做不同比例的混色。這個比例可能由透明度決定,也可能由其他參數計算出來。實際上在這個Stage 可能進行的Operation還有不少(例如Dithering),這裡只是舉出最常見的幾種。
最後,將算出來的顏色結果寫進framebuffer中,就完成了整個Rendering pipeline過程了。
4 Rendering pipeline 總結
從一個Vertex,加上Primitve變成Triangle,Triangle光柵化(Rasterizing)成很多的Pixel,Pixel再經過Raster operation之後進到framebuffer中。
這是一個適合平行化的結構,以Pixel operation為例,因為每個Pixel之間是獨立的,因此我可以使用十條平行的Pixel operation管線,一次處理十個Pixel的資料。而這是Rasterizing演算法的優點之一。
雖然稍微提到了些硬體,但是基本上目前介紹的Pipeline是很概念式的。它並沒有限定要在什麼樣的硬體上完成。也沒有限定是openGL pipeline或者是Direct3D pipeline。
事實上這些運算通通在CPU中完成也是可以的,只是效率的問題而已。筆者修過的Computer Graphic基礎課程,其作業便是要將簡單的3D pipeline實作出來(當然,不可以使用任何的library或API)。事實上以今日的CPU能力也能達到簡單的Rendering效果(甚至沒使用MMX、SSE3、SSE3等加速指令集)。
有了一個基礎的Redering pipeline之後,我們可以進入下一部份的討論:這個概念式的pipeline,要怎麼轉換為一個易於讓程式設計者操作使用的pipeline?又有哪些地方是可以做硬體加速(Hardware Acceleration)的呢?
第一個問題的解答是API: OpenGL & Direct3D (當然,還有絕種的Glides..)。
第二個問題的解答,讓我們從voodoo1代開始,直到G80與R600架構做個硬體巡禮。
API的發展與硬體的發展是息息相關的,因此這兩個問題也可以說是一個問題,在接下來的章節中,我們將討論這個問題的過去、現在,或許提到一些未來:)
相关日志
If you enjoyed this post, please consider to leave a comment or subscribe to the feed and get future articles delivered to your feed reader.
