OpenGL管道概括

來源:互聯網
上載者:User

標籤:ar   io   color   os   sp   strong   on   資料   log   

階段1.  頂點 ->圖元

幾何頂點被組合為圖元(點,線段或多邊形),然後圖元被合成片元,最後片元被轉換為幀緩衝中的象素資料。

階段2.  圖元  ->片元

圖元被分幾步轉換為片元:圖元被適當的裁剪,顏色和紋理資料也相應作出必要的調整,相關的座標被轉換為視窗座標。最後,光柵化將裁剪好的圖元轉換為片元。

1) 裁剪

在裁剪時點,線段和多邊形處理略微不同。對於點,要麼保留原始狀態(在裁剪體內部),要麼被裁掉(在裁剪體外部)。對於線段和多邊形來說,如果部分在裁剪體外部,則需要在裁剪點產生新的幾何頂點。對於多邊形,還需要在新增的頂點間增加完整的邊。不論裁剪了線段還是多邊形,都需要給新增幾何點賦予邊界標誌、法線、顏色和紋理座標資訊。

裁剪過程時兩步:

a 應用程式指定裁剪(Application-specific clipping),一旦組合圖元完成後,如果在程式中用glClipPlane()函數定義了任意的裁剪面,就進行裁剪。

b 視景體裁剪(View volume clipping),隨後,圖元被投影矩陣投影(進入裁剪座標系),被相應的視景體裁剪。投影矩陣可以由glFrustum() 或者glOrtho()定義,投影矩陣的操作和上面其他矩陣變換的操作相同。

2) 轉換到視窗座標

裁剪座標在轉換為視窗座標之前,要除以規格化裝置座標(normalized device coordinates)的w值進行正常化。然後對這些正常化資料進行視口變換(viewport)計算產生視窗座標。可以用glDepthRange()和glViewport()控制視口大小,決定螢幕上顯示圖象的地區。

3) 光柵化

光柵化是將一個圖元轉變為一個二維圖象(其實只是布滿平面,沒有真正的替換幀緩衝區)的過程。二維圖象上每個點都包含了顏色、深度和紋理資料。將該點和相關資訊叫做一個片元(fragment)。(yuyu註:這就是片元和像素之間的關鍵區別,雖然兩者的直觀印象都是的像素,但是片元比像素多了許多資訊,在光柵化中紋理映射之後圖元資訊轉化為了像素)在這個階段,對象素繪製和位元影像進行操作需要用到當前柵格位置(用glRasterPos*()定義)。正如上面討論的,三種圖元的光柵化方法是不同的,另外,象素塊和位元影像也需要光柵化。

a)圖元

採用glPointSize(), glLineWidth(), glLineStipple()和 glPolygonStipple()函數可以選擇圖元的光柵化維數和模式。另外,還可以用glCullFace(), glFrontFace()和glPolygonMode()控制多邊形正反面不同的光柵化效果。

b)象素

有幾個函數實現象素儲存和轉換。函數glPixelStore*()用於記憶體中的象素是如何儲存的。glPixelTransfer*() and glPixelMap*()用於象素在寫入框架緩衝區前是如何處理的。glDrawPixels()定義了一個象素矩形。用glPixelZoom()實現象素的縮放。

c)位元影像

位元影像是具有特定片元模式的0和1的矩形。每個片元有相同的相關資料。可以用glBitmap()定義。

d)紋理儲存

紋理貼圖是將指定的部分紋理圖象映射到每個圖元上。每個片元(fragment)具有的紋理座標屬性,該座標與紋理圖象座標組應,得到紋理圖象該位置的顏色值來修改片元的RGBA顏色,從而完成這個映射過程。用glTexImage2D()或glTexImage1D()來定義紋理圖象。glTexParameter*()和glTexEnv*()來控制紋理如何解釋和應用到一個片元上。

e)霧

已經光柵化的片元具有紋理貼圖修正後顏色,可以採用融合因子再融合霧顏色,該融合因子大小根據視點和片元間的距離來定。用glFog*()指定霧化顏色和融合因子。

 

 

階段3.  片元->像素

 

OpenGL允許光柵化產生一個片元,只要該片元通過一系列檢測就可以修改框架緩衝區中對應象素。如果它通過測試,片中繼資料可以直接替換框架緩衝區中的已有值,或者和已有值合并,這取決於設定的模式。

1)象素所有權(ownership)檢測

第一個測試是判斷在框架緩衝區中的象素所對應的某個片元是否屬於當前OpenGL上下文。如果屬於,片元進行下一個測試。如果不屬於,視窗系統決定是否忽略該片元,或者是否進行下一步片元操作。

2)裁剪檢測

用glScissor()函數,可以定義一個任意螢幕校準矩形,在該矩形外的片元將被忽略。

3)Alpha檢測

Alpha測試只能在RGBA模式下進行,如果片元的alpha值超出一個固定參照值,片元將被忽略,這個比較函數可以用glAlphaFunc()實現並設定參考值。

4)模版檢測

當模版緩衝區的值超出一個參照值,模版測試將有條件的忽略該片元。這個比較函數和固定值可以用glStencilFunc()實現。不論圖元通過或沒有通過模版測試,模版緩衝區中的值會根據glStencilOp()函數進行修改。

5)深度檢測

當深度緩衝區的值與參照值的比較失敗,深度測試忽略該片元。GlDepthFuc()用來執行這個比較命令。如果模版啟用,深度比較的結果會影響模版緩衝區值的更新。

6)融合

融合合并了一個片元R、G、B和A值和儲存在框架緩衝區對應位置的這些值。融合只能在RGBA模式下實現,它的實現需要片元的alpha值和對應當前儲存象素,還需要RGB值。用glBendFun()控制,可以修改融合因子的源和目標。

7)抖動

如果啟動抖動,片元的顏色或者色彩索引採用抖動演算法。這個演算法只需要片元的顏色值和它的x和y座標。

8)邏輯操作

最後,在片元和框架緩衝區對應值之間要進行一個邏輯操作,結果將替換當前框架緩衝區的值。用glLogicOp定義想要的邏輯操作。這個邏輯操作只能在色彩索引模式下運行,而不能在RGBA模式運行。

 

象素

   在OpenGL流水線的上個階段,片元轉換為框架緩衝區中的象素。框架緩衝區實際上是一組邏輯緩衝區——包括顏色緩衝區、深度緩衝區、模版緩衝區和累積緩衝區。顏色緩衝區包括左、前右、後左、後右和一些輔助緩衝值(auxiliary buffers)。可以直接從中讀取或者複製。對於OpenGL不同上下文,這些緩衝區可能不全

1)框架緩衝區操作

用glDrawBuffer為繪圖選擇一個顏色緩衝區。另外在預片元化(per-fragment)操作後,可以用四個不同函數保留寫入這些邏輯緩衝區的操作,glIndexMask(), glColorMask(), glDepthMask(), and glStencilMask()。glAccum()對累積緩衝區進行操作。最後glClearColor(), glClearIndex(), glClearDepth(), glClearStencil()和glClearAccum().對不同緩衝區中指定相對應的顏色值、色彩索引值、深度值、模板值和累積值。

2)讀取和複製象素

用glReadPixel()從框架緩衝區中把象素讀到記憶體中,進行各種操作,儲存處理結果。另外,可以用glCopyPixel()從框架緩衝區中複製一塊象素到另一個幀混存。glReadBuffer()可以讀取和複製顏色緩衝區中的象素。

OpenGL管道概括

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.