opengl 學習1 opengl 概述
2023年06月29日
opengl 學習1 opengl 概述
table of contents
1 概述
2 設計實現:client-server 模式
3 狀態機
4 opengl 渲染管線
4.1 顯示列表 display list
4.2 頂點操作 vertex operation
4.3 圖元裝配 primitive assembly
4.4 畫素操作 pixel operation
4.5 紋理記憶體 texture memory
4.6 光柵化 rasterization
4.7 片元操作 fragment operation
5 opengl 圖元
6 重新整理緩衝
1 概述
opengl 是乙個跨平台,跨程式語言的程式設計介面,用於生成二維、三維影象。opengl 是乙個直接操縱硬體的軟體介面。opengl 可以工作在網路模式下,客戶端和伺服器不是同一臺機器:客戶端是opengl執行命令,而伺服器端是用來顯示渲染結果。我們所說的 opengl 命令對應乙個 opengl api操作。 2 設計實現:client-server 模式
opengl 是一種 client-server 模式,當你的應用程式呼叫 opengl 函式時, 它將告訴 opengl client, 然後 client 將渲染命令傳送給 server. 這裡client 和 server 可能是不同的計算機,或是同一臺計算機上的不同程序。一般來說 server 是在 gpu 上處理的,而 client 是在 cpu 上處理的,這樣分擔了 cpu 的負擔, 同時高效利用了 gpu. 3 狀態機
opengl 內部有乙個狀態機, 使用 opengl 的 api,實際上是來操縱這個狀態機來設定狀態,你可以設定當前的顏色,光照,混色等等, 當渲染的時候,會使用狀態機的當前設定。狀態機中的大多數變數(兩種狀態的)的可以使用 glenable() , gldisable() 來設定, 可以通過 glisenabled() 來查詢狀態. 可以通過 glpushattrib() , glpopattrib() 來自動儲存恢復狀態機中的變數。 4 opengl 渲染管線
opengl 的核心部分是渲染管線,這個太核心,所以你不必完全理解它的工作流程。
4.1 顯示列表 display list
顯示列表是一系列的 opengl 命令, 壓縮儲存起來以備以後執行。執行的時候, 將按照順序執行。所有的資料,幾何體(頂點),和畫素資料可以放到顯示列表中。使用顯示列表可以提高效能,尤其在網路模式中,client 和 server 是不同的計算機。顯示列表是 server 狀態的一部分,它們駐留在 server中, 因此避免通過網路重**送這些資料, 從而降低網路開銷。 4.2 頂點操作 vertex operation
對於頂點資料,接下來的處理步驟是"頂點操作":將頂點轉換為圖元。對於有些型別的頂點資料(如空間座標),使用 4*4 的浮點型矩陣對齊進行變換。三維空間座標被投影到螢幕。
如果啟用了高階特性,這個階段需要完成的工作將更多。如果使用了紋理對映,將可能生成紋理座標,並對其進行變換。如果光照功能被啟用,將執行光照計算:根據變換後的頂點、面法線和其他關照資訊計算顏色值。 4.3 圖元裝配 primitive assembly
圖元裝配的乙個主要內容就是裁剪,它的任務是消除位於半空間(half-space)之外的那部分幾 何圖元,這個半空間是由乙個平面所定義的。點裁剪就是簡單地接受或拒絕頂點,直線或多邊形裁剪 則可能需要新增額外的頂點,具體取決於直線或多邊形是如何進行裁剪的。 在有些情況下,接下來需要執行乙個叫做透視除法(perspective division)的步驟。它使遠處的 物體看起來比近處的物體更小一些。接下來所進行的是視口(viewport)和深度(z座標)操作。如 果啟用了剔除功能(culling)並且該圖元是乙個多邊形,那麼它就有可能被剔除測試所拒絕。根據多邊形模式,多邊形可能畫成點的形式或者直線的形式。
這個階段產生的結果就是完整的幾何圖元,也就是根據相關的顏色、深度(有時還有紋理座標值 以及和光柵化處理有關的一些指導資訊)進行了變換和裁剪的頂點。 4.4 畫素操作 pixel operation
首先將系統記憶體中的畫素資料進行拆封:從某種格式轉換為合適數目的分量。接下來對資料進行縮放,偏移和畫素對映。然後將得到的資料進行擷取,並將其寫入紋理記憶體後傳送給光柵化操作進行處理。
如果是從幀快取中讀取畫素資料,則對其進行畫素轉移(縮放、偏移、對映和擷取)操作。然後將其封裝為合適格式,並儲存到系統記憶體的陣列中。
有一些特殊的畫素複製操作,可以用於將資料從幀快取中複製到幀快取的其他地方後紋理記憶體中。資料被寫入到紋理記憶體後幀快取之前,只經過一遍畫素轉移操作。 4.5 紋理記憶體 texture memory
紋理影象被載入到紋理記憶體中,等待被對映到幾何多邊形物件上。 4.6 光柵化 rasterization
光柵化是將幾何資料和畫素資料轉換為片元(fragment).乙個片元對應幀緩衝區中乙個畫素, 包含了顏色,深度,線寬,點寬和反走樣資訊。如果設定了 gl_fill 模式,多邊形區域內的畫素點會被填充。 4.7 片元操作 fragment operation
將片元寫入幀快取之前,會執行一系列的操作,其中的每一步操作都可以啟用和禁用。
第乙個操作是紋理生成,從紋理記憶體中選取乙個紋理物件,然後應用到對應片元上。然後執行霧計算。之後進行一系列的測試:裁剪測試 -> alpha 測試 -> 模板測試 -> 深度測試,如果未通過某項測試,後續的測試將不再執行。再之後,執行混色,抖動,邏輯運算和遮蔽。最後處理後的片元被繪製到合適的快取中,成為畫素。 5 opengl 圖元
一切複雜的物體都可以分解為細小的三角形或四邊形。看遊戲中的3d人物,去除紋理貼圖之後,就是乙個個的頂點連成的線面組成。opengl 提供了一些基本的圖元,包括點、線、三角形、四邊形、多邊形等等, 而繪製圖元是利用 glbegin() 和 glend() 來進行。如我們繪製幾個點:
glbegin(gl_points); glvertex3f (0.0f, 0.0f, 0.0f); glvertex3f (1.0f, 0.0f, 0.0f); glvertex3f (1.0f, 1.0f, 0.0f); glend(); 6 重新整理緩衝
如同我們在操作檔案流的時候,我們通過 fwrite 並不能及時的回饋到檔案中, 而是寫入到了緩衝區中,當緩衝區滿的時候才將之寫入檔案, 我們可以手動通過 fflush 來將緩衝區內容重新整理到檔案中去。在 opengl 中類似,opengl 的命令並不能及時執行, 所有的命令先儲存在緩衝區中,(網路緩衝區或是顯示卡加速緩衝區),當緩衝區滿的時候才會傳送給gpu(server)去執行。 glflush() 函式可以將緩衝區命令全部送到gpu, 然後不管gpu那邊有沒有將命令全部執行完,就立即返回。而 glfinish() 和 glflush() 的功能一樣,清空緩衝區,傳送給 server, 但是會等待 server 執行完畢後返回給應用程式。區別大似 windows 訊息處理中的 postmessage 和 sendmessage . date: 2010-07-01 21:47:39 html generated by org-mode 6.33x in emacs 23
openGL學習筆記1 openGL程式框架
在我們想要動手編寫opengl的程式時,首先需要建立乙個opengl的視窗,以支援opengl的圖形處理功能。建立視窗的方式主要有兩種 1.使用glut函式庫提供的函式 2.借助windows中的gdi 為了 的實用性和易於理解,筆者更傾向於方法2,若只是單純的只是想要學習opengl,則選用方法1...
OpenGL學習(一) OpenGL簡介
opengl是乙個開放式的 與硬體無關的圖形軟體包。opengl是乙個專業的 功能強大 呼叫方便的底層三圍圖形函式庫。opengl是乙個圖形與硬體的介面。建模變換 著色光照處理和材質設定 位圖顯示 影象增強和紋理對映 雙快取動畫 根據基本圖形單元 點 線 多邊形 影象和點陣圖 建立景物模型,並且對所...
opengl碗狀 OpenGL學習
一 opengl的基本語法 1.vbo vertex buffer object 頂點緩衝物件,這個是用來儲存大量頂點 2.vao vertex array object 頂點陣列物件 3.ibo index buffer object 索引緩衝物件 二 opengl的基本使用方法 1.獲取頂點 片...