本節書摘來自華章出版社《opengl程式設計指南》一書中的第1章,第1.1節,作者 bill licea-kane ,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視
opengl是一種應用程式程式設計接口(application programming interface, api),它是一種可以對圖形硬體裝置特性進行通路的軟體庫。opengl庫的4.3版本(即本書所使用的版本)包含了超過500個不同的指令,可以用于設定所需的對象、圖像和操作,以便開發互動式的3維計算機圖形應用程式。
opengl被設計為一個現代化的、硬體無關的接口,是以我們可以在不考慮計算機作業系統或視窗系統的前提下,在多種不同的圖形硬體系統上,或者完全通過軟體的方式(如果目前系統沒有圖形硬體)實作opengl的接口。opengl自身并不包含任何執行視窗任務或者處理使用者輸入的函數。事實上,我們需要通過應用程式所運作的視窗系統提供的接口來執行這類操作。與此類似,opengl也沒有提供任何用于表達3維物體模型,或者讀取圖像檔案(例如jpeg檔案)的操作。這個時候,我們需要通過一系列的幾何圖元(geometric primitive)(包括點、線、三角形以及patch)來建立3維空間的物體。
opengl已經誕生了很長時間,它最早的1.0版本是在1994年7月釋出的,通過silicon的圖形計算機系統開發出來。而到了今天已經釋出了非常多的opengl版本,以及大量建構于opengl之上以簡化應用程式開發過程的軟體庫。這些軟體庫大量用于視訊遊戲、科學可視化和醫學軟體的開發,或者隻是用來顯示圖像。不過,如今opengl的版本與其早期的版本已經有很多顯著的不同。本書将介紹如何使用最新的opengl版本來建立不同的應用程式。
一個用來渲染圖像的opengl程式需要執行的主要操作如下所示。(1.4節将對這些操作進行詳細解釋。)
從opengl的幾何圖元中設定資料,用于建構形狀。
使用不同的着色器(shader)對輸入的圖中繼資料執行計算操作,判斷它們的位置、顔色,以及其他渲染屬性。
将輸入圖元的數學描述轉換為與螢幕位置對應的像素片元(fragment)。這一步也稱作光栅化(rasterization)。
最後,針對光栅化過程産生的每個片元,執行片元着色器(fragment shader),進而決定這個片元的最終顔色和位置。
如果有必要,還需要對每個片元執行一些額外的操作,例如判斷片元對應的對象是否可見,或者将片元的顔色與目前螢幕位置的顔色進行融合。
opengl是使用用戶端-服務端的形式實作的,我們編寫的應用程式可以看做用戶端,而計算機圖形硬體廠商所提供的opengl實作可以看做服務端。opengl的某些實作(例如x視窗系統的實作)允許服務端和用戶端在一個網絡内的不同計算機上運作。這種情況下,用戶端負責送出opengl指令,這些opengl指令然後被轉換為視窗系統相關的協定,通過共享網絡傳輸到服務端,最終執行并産生圖像内容。