圖形繪製過程(流水線)

圖形繪製流水線體系結構

我們首先需要明白,圖像都是通過一組圖元組成,每個圖元又包含一組頂點,所以所有的圖像都是可以通過類似過程來進行處理,最後達到成像的目的,簡單來說,就是頂點如何轉變爲像素的問題。
現有的常用技術是通過以下四步來解決,比較重要的是vertex shader以及fragment shader:

(1)頂點處理
總的來說,這個模塊的主要功能是執行座標變換、爲了保留三維信息而做的投影變換和計算頂點的顏色值。
在成像過程中,有許多步驟可以看做是對象在不同座標系下的表示之間的變換。對象的內部表示,不管是在觀察座標系下的還是在圖形軟件使用的其他座標系下的,最終必須轉換成在顯示器座標系下的表示。
在經過多次變換之後,最後還要進行一個投影變換。一般而言,當對象在流水線中被處理時,希望儘可能久地保留三維信息,因此,繪製流水線中的投影變換多少要比投影更一般。除了保持三維信息以外,還可以實現許多其他類型的投影。
對頂點顏色的指派可以簡單到由程序指定一種顏色,也可以複雜到利用基於物理的真實感光照模型來計算,這樣的光照模型考慮了對象的表面屬性和場景中的特定光源。

(2)裁剪和圖元組裝
簡單來說就是,把視線之外的圖元全部去掉,最後輸出可以成像的圖元。
標準圖形繪製流水線中第二個基本模塊的任務是裁剪和組裝圖元。因爲沒有成像系統能夠次對整個場景成像,所以我們必須進行裁剪。人類視網膜的尺寸是有限的,大約對應於90°的視域。照相機的膠片也是大小有限的,其視域可以通過選擇不同的透鏡來調節。
虛擬照相機的視域也是有限的,這是通過裁剪體( clipping volume )來體現的。裁剪體裏面的對象的投影可以在圖像裏出現,而在裁剪體外面的對象則不被成像,我們說它們被裁剪掉了。跨越裁剪體邊界的對象在圖像中是部分可見的。
裁剪必須針對逐個圖元進行,而不能針對逐個頂點進行。這樣,在繪製流水線的這個階段,在裁剪之前,必須把頂點組裝成像線段和多邊形這樣的圖元。所以,這個階段的輸出是一些其投影可以被成像的圖元。

(3)光柵化
這一個步驟的目的是把用頂點表示的圖元變成片元(攜帶自己信息的潛在像素)
光柵化會確定圖元所覆蓋的片段,利用頂點屬性插值得到片段的屬性信息。
由裁剪模塊得到的圖元仍然是用頂點表示的,爲了生成幀緩存中的像素還必須做進一步處理。光柵化模塊對每個圖元輸出一組片元( fragment )。可以把片元看做是攜帶自己信息的潛在像素,片元所攜帶的信息包括它的顏色、位置和深度信息。我們用片元來更新幀緩存中的對應像素並且在繪製流水線後面的階段就可以確定某個片元是否位於其他片元的後面,這些片元都對應於同一個像素。
如果還想要細分的話,有着建立三角形和遍歷三角形的階段,前者計算計算每條邊上的像素座標,後者檢查每個像素是被哪一個三角形網格所覆蓋。當像素被三角形覆蓋時,就會生成一個片元。在此階段中,會根據上一個階段的計算結果來判斷一個三角形網格覆蓋了哪些像素,並使用三角形網格三個頂點信息對整個覆蓋區域的像素進行插值。

(4)片元處理
這一步理解起來比較簡單,就是根據上一步傳遞過來的片元信息進行渲染的過程
繪製流水線的最後一個模塊利用光柵化模塊生成的片元來更新幀緩存中的像素。(這裏需要根據輸入來計算)如果應用程序生成的是三維數據,那麼一些片元可能是不可見的,因爲它們所定義的表面在其他表面的後面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章