大家可能對圖形編程有些陌生,往小了說,我們在計算機或手機上玩遊戲時,看到的一些3D特效,都是通過圖形編程實現的。往大了說,無論是Windows、iOS還是Android,能看到的界面本身就是圖形編程的傑作。
圖形編程面臨的一個最基本的問題就是如何用程序在顯示器上繪製東西,比如一個按鈕、一張美女圖片、一個正在放「大招」的英雄。簡單來說,有兩種繪製方式:一種是CPU在內存裡準備好了要繪製的東西,然後交給顯示器顯示;另一種是顯卡在顯存裡準備好要繪製的東西,交給顯示器顯示。前者稱為軟體繪製,因為CPU本身並不擅長做圖形相關的運算,效率也就高不到哪兒去。後者稱為硬體加速,顯卡天生就是用來處理圖像的,所以效率很高。這也就是為什麼我們常說大型遊戲「吃顯卡」,但只需要一個入門級的CPU就能流暢運行了,因為在它們運行的時候,CPU其實是個配角。
那麼問題來了,如何才能充分調動顯卡的強大能力,幫助我們繪製圖形呢?OpenGL就是為此而生的。OpenGL是一組API,這些API可以運行在不同的平臺上,可以支持各種語言。最重要的是,它能利用顯卡的硬體加速能力,幫助我們繪製圖形。
有700多個API,每個API代表一種能力,比如其中有一個叫glClearColor,可以把屏幕塗成用戶想要的顏色。OpenGL 得以流行,還有一個很重要的原因是跨平臺。無論用 C++語言寫程序,在PC上運行,還是用Objective-C語言寫程序,在iOS上運行,都能用OpenGL。Java能夠實現跨平臺是因為它下面有一個虛擬機,不同的平臺都做了兼容,給上層調用的都是一樣的API。OpenGL也是這樣做的。用OpenGL做圖形編程,根本不用擔心平臺不適配問題,因為已經有人把這些髒活累活都做了,適配好了。但是讀者可千萬不要誤會,以為OpenGL就只是幾百個API。
實際上它有自己的一套規則。在任何一本介紹OpenGL的書上,都能看到這樣一句話:OpenGL是一個狀態機。什麼意思呢?狀態機控制很多狀態不停地切換。OpenGL的幾百個API裡,有不少是用來設置狀態的。每次設置一個狀態,都是一次狀態切換,直到最終繪製完成。比如設置畫筆的顏色是紅色,那麼之後繪製的所有圖形都是紅色的,直到設置成綠色,後面才會繪製綠色的圖形。
我們用地圖導航舉例。當用戶選定了目的地之後,導航路線就生成了。用戶可以把整條路線裡的每一條小路當作一個狀態,每進入一條小路就切換一次狀態。這樣經過一個又一個的狀態切換,最後會到達目的地。
對OpenGL來說,狀態切換過程結束,繪製任務就完成了。OpenGL的繪製流程大約要經過幾個步驟。首先,要把要畫的東西拆成三角形之類的基本圖形,然後在三維空間坐標系裡給它們安排合適的位置,之後把燈光加上去,使要畫的東西有一種立體感,最後,把這些東西轉化成屏幕上的像素點(即光柵化),整個繪製就算是完成了。OpenGL這兩年比較火,主要還是因為iOS和Android都靠它來做遊戲、寫界面。嚴格地說,在移動平臺上,大家用的是OpenGL-ES,是OpenGL的一個子集。
OpenGL 有700多個API,OpenGL-ES 裁掉了其中不常用的、移動端不好用的一些API。麻雀雖小,五臟俱全,OpenGL-ES也可以充分發揮顯卡的硬體加速能力,讓手機界面操作如絲般順滑。