OpenGL概述

孫孫_發表於2020-12-26

什麼是OpenGL

OpenGL是一種API,是一種可以對圖形裝置訪問的軟體庫。
OpenGL被設計為一個現代化的、與硬體無關的介面。(可以在不考慮作業系統或視窗系統/在不同圖形硬體系統上/完全通過軟體的方式 實現OpenGL介面)。
一個用於渲染的OpenGL程式主要操作:

從OpenGL的幾何圖元(包括點/線/三角形以及面片)中設定資料,用於構建形狀
使用不同的著色器對輸入圖後設資料執行計算操作,判斷他們的位置,顏色,以及其他渲染屬性
光柵化:將輸入圖後設資料轉換為與螢幕對應的片元(OpenGL中的片元若最終渲染為影像,那麼片元等同於畫素)
針對光柵化過程產生的每個片元,執行片元著色器,決定該片元的最終顏色和位置
對片元進行一些額外的操作,如判斷片元對應的物件是否可見/將片元的顏色與當前螢幕位置的顏色進行融合

OpenGL是以客戶端 — 服務端的形式實現的
編寫的應用程式(客戶端)— 計算機圖形硬體廠商所提供的OpenGL實現(服務端)。
OpenGL的某些實現(如X視窗系統的實現)允許服務端和客戶端在一個網路內的不同計算機上執行。這種情況下,客戶端負責提交OpenGL命令,然後將其轉換為視窗系統相關的協議,通過共享網路傳輸到服務端,服務端最終執行併產生影像內容。
在大部分現代實現方案中,硬體圖形加速器被用來完成大部分OpenGL命令,它往往被構建在計算機的核心處理器中(依舊是獨立部件)/作為一個獨立的電路板插入到計算機主機板上。無論是哪種形式,我們都應當將圖形加速器作為服務端,把使用者程式作為客戶端對待。

初識OpenGL

OpenGL程式的基本結構
1、初始化物體渲染所對應的狀態
2、設定需要渲染的物體

渲染:表示計算機從模型建立到生成最終影像的過程

OpenGL是一種基於光柵化的渲染系統。諸如光線追蹤(ray tracing)、光子對映(photon mapping)、路徑追蹤(path tracing)、基於影像的渲染(image-based rendering)這樣的技術都能簡單地在可程式設計圖形硬體端實現了。
畫素是顯示器上最小的可見單元。計算機將所有的畫素儲存到幀快取由圖形硬體裝置管理的一塊獨立記憶體區域,可以直接對映到最終的顯示裝置上)中

OpenGL語法

OpenGL庫中所有函式都以“gl”作為字首,所有常量以“GL_”作為字首。
OpenGL是一個C語言形式的庫。

字尾資料型別C語言型別OpenGL型別
b8位整型signed charGLbyte
s16位整型signed shortGLshort
i32位整型intGLint GLsizei
f32位浮點數floatGLfloat GLclampf
d64位浮點數doubleGLdouble GLclampd
ub8位無符號整型unsigned charGLubyte
us16位無符號整型unsigned shortGLushort
ui32位無符號整型unsigned intGLuint GLenum GLbitfield

使用C的資料型別直接表示OpenGL資料型別時,因為OpenGL自身實現不同,可能會造成型別不匹配。

OpenGL渲染管線

渲染管線:一系列資料處理過程,將應用程式的資料轉換成最終渲染出的影像
OpenGL首先接收使用者提供的幾何資料(頂點和幾何圖元),並且將其輸入到一系列著色器階段(頂點著色、細分著色、幾何著色中進行處理,然後送入光柵化單元(負責對所有剪下區域內的圖元生成片後設資料),對生成的每個片元都執行一次片元著色器。

準備向OpenGL傳輸資料

OpenGL需要將所有的資料都儲存到快取物件(由OpenGL維護的一塊記憶體區域)中,

將資料傳輸至OpenGL

當快取初始化完畢之後,我們可以通過呼叫OpenGL的一個繪製命令來請求渲染幾何圖元。
OpenGL的繪製通常是將頂點資料傳輸到OpenGL服務端。我們可以將一個頂點視為一個需要統一處理的資料包(自己定義構成頂點的所有資料,一般會包括位置資料)。

頂點著色

對於繪製命令傳輸的每個頂點,OpenGL都會呼叫一個頂點著色器來處理頂點相關的資料。
一個複雜的應用程式可能包含許多頂點著色器,但同一時刻只能有一個頂點著色器起作用。

細分著色

分為細分控制著色器(管理面片資料)和細分計算著色器(生成最終形狀)兩個著色器階段。
頂點著色器處理每個頂點的關聯資料之後,如果同時啟用了細分著色器後,細分著色器會使用面片(patch)來描述一個物體的形狀,並且使用相對簡單的面片幾何體連線來完成細分的工作,會導致幾何圖元的數量增加,且模型的外觀會更加平順。

幾何著色

幾何著色允許在光柵化之前對每個幾何圖元做進一步處理,如建立新的圖元。

圖元裝配

前面的著色階段處理的都是頂點資料,這些頂點構成幾何圖元的所有資訊也會被傳遞到OpenGL當中。
圖元裝配階段會將這些頂點與相關的幾何圖元之間組織起來,準備下一步剪下和光柵化工作。

剪下

頂點可能會落在視口(可以進行繪製的區域),此時與頂點相關的圖元會做出改動,以保證相關的畫素不會在視口外繪製,是由OpenGL自動完成的

光柵化

將更新後的圖元傳遞到光柵化單元,生成對應的片元。
光柵化的工作是判斷某一部分的幾何體(點、線、三角形)所覆蓋的螢幕空間。得到了螢幕空間資訊以及輸入的頂點資料之後,光柵化單元就可以直接對著片元著色器中的每個可變變數進行線性插值,然後將這些值傳遞給片元著色器。
我們可以將一個片元視為一個“候選的畫素”(可以放置在幀快取中的畫素),也有可能最後被剔除,不再更新對應的畫素。

OpenGL實現光柵化和資料插值的方法與具體平臺相關,無法保證在不同平臺上的插值結果總是相同的。

光柵化意味著一個片元的生命伊始,而片元著色器的計算過程本質上是計算這個片元的最終顏色,但絕不等價於OpenGL對這個片元的所有操作。

片元著色

最後一個可以通過程式設計控制螢幕上顯示顏色得階段。
我們使用著色器來計算最終顏色(逐片元操作可能還會改變一次顏色)和它得深度值。
會使用紋理對映的方式對頂點著色計算出的顏色值進行處理。
片元丟棄(discard):不應該繼續繪製某個片元,可以在片元著色器中終止對這個片元的處理。

頂點著色(包括細分和幾何著色)決定了一個圖元位於螢幕的什麼位置
片元著色決定某個片元的顏色應該是什麼

逐片元操作

最後處理獨立片元的過程。
會使用深度測試(depth test/z快取)和模板測試(stencil test)來決定一個片元是否可見。
如果一個片元成功地通過了所有啟用的測試,就可以直接繪製到幀快取中了,它所對應畫素的顏色值(可能包含深度值)也會更新。如果開啟了融混(blending)模式,那麼片元的顏色會和當前畫素的顏色值疊加,形成一個新的值寫入到幀快取中。
一般來說,畫素資料來自於影像檔案(也可能是OpenGL直接渲染),儲存在紋理貼圖當中,通過紋理對映的方式呼叫。

相關文章