OpenGL 是一種規(guī)范,具體內(nèi)容由顯卡廠商實(shí)現(xiàn)
OpenGL 是一個(gè)圖形API,所以它允許我們做一些關(guān)于圖像方面的事情。特別地,OpenGL實(shí)際上允許我們?cè)L問我們的GPU(顯卡),顯卡可以更有力地繪制圖形。
實(shí)際上為了在電腦和設(shè)備(像手機(jī))上使用顯卡,我們實(shí)際上需要一些API來操縱顯卡。OpenGL是這類API中的一種,我們也有其它這方面的API像是Direct3D(Window 專用)、Vulkan(最新一代的OpenGL,語法方面和OpenGL差異較大)、Metal(蘋果專用)和一些其它的。
OpenGL允許我們一定程度上操控我們的顯卡。OpenGL的核心本身是一種規(guī)范,類似于C++規(guī)范。實(shí)際上它并沒有確定任何的代碼或類似的事情。它本身是一種規(guī)范,類似說“Hey,這個(gè)函數(shù)應(yīng)該存在,他需要這些參數(shù),并且需要返回這個(gè)值”。他只是個(gè)告訴你可以利用這些API做什么的規(guī)范,而不提供任何實(shí)現(xiàn)。這意味著它肯定不是一個(gè)庫,因?yàn)镺penGL本身是沒有任何代碼的。
那么問題來了:“我們上哪下載OpenGL呢?”
實(shí)際上不需要下載它,它本身是一個(gè)規(guī)范。
那誰去實(shí)現(xiàn)它呢,誰去為那些你會(huì)使用的OpenGL函數(shù)寫代碼呢?答案是你的顯卡生產(chǎn)商。
所以如果你用的是NVDIA顯卡,那么你的顯卡驅(qū)動(dòng)程序就會(huì)包含OpenGL的實(shí)現(xiàn)。并且所有的顯卡廠商,像是AMD,Intel等,他們會(huì)有他們自己的實(shí)現(xiàn)。每個(gè)廠商對(duì)OpenGL的實(shí)現(xiàn)都會(huì)有輕微的不同。這就是為什么在很多情況下,有些代碼基于NVIDIA顯卡的驅(qū)動(dòng)程序上能工作,但是在AMD電視或者其他顯卡上顯得有一些 不同,甚至產(chǎn)生Bug。關(guān)鍵是在于你的顯卡廠商是如何編寫OpenGL實(shí)現(xiàn)的。
“OpenGL 是開源的?" 不是
不是。因?yàn)槭紫?,它是顯卡廠商實(shí)現(xiàn)的,它們顯然不會(huì)將顯卡驅(qū)動(dòng)的源碼開源。
OpenGL優(yōu)點(diǎn)跨平臺(tái),簡(jiǎn)單
"OpenGL"是跨平臺(tái)的,寫一份OpenGL代碼就可以在Windows,Mac,Linux,IOS,安卓系統(tǒng)上運(yùn)行。說那種API最強(qiáng)沒有必要,因?yàn)槠脚_(tái)原生的東西往往要更好一些。這也就是說OpenGL更像是個(gè)確切的規(guī)范,他很普通。如果你把它和低層次的,像DirectX12或Vulkan比較的話。OpenGL可能是你現(xiàn)在能學(xué)到的最簡(jiǎn)單的那個(gè)API了。
比不上DirectX11
老的OpenGL和現(xiàn)代OpenGL
OpenGL在90年代發(fā)布,那時(shí)的GPU并不是靈活的并且可編程的,你不能隨心所欲地去操控它,尤其是使用較底層的API。但是現(xiàn)在,人們可以很大程度上控制它。顯卡廠商給了程序員和開發(fā)者更多的控制權(quán)。
老的OpenGL更像是一個(gè)流水線,所以從另一個(gè)方面來說,你說我要畫一個(gè)三角形,并且我要加入光源,那么你要怎么加入這個(gè)光源呢。你可以告訴OpenGL類似"Lighting = True"的代碼,這樣可以啟用光照。然后你告訴OpenGL你想在這里啟用光照,像這樣的就叫流水線式的操作。
這種老OpenGL很容易被使用,代碼也很少。但不幸的是你也沒什么控制權(quán)。我們想要更多的控制權(quán),我們想要實(shí)現(xiàn)更多令人驚嘆的圖形。
老OpenGL和現(xiàn)代OpenGL的最大區(qū)別在于"著色器“。著色器是一段運(yùn)行在GPU上的程序。所以我們用C++或JAVA或C#其他什么編程語言寫的程序都是運(yùn)行在CPU上的。但當(dāng)我們針對(duì)圖形處理的時(shí)候,我們想要精準(zhǔn)控制GPU,所以可能要將一些代碼從CPU放到GPU上。因?yàn)樗鼈兛梢栽贕PU上運(yùn)行地更快。這就是著色器存在的意義。著色器只是允許我們?cè)贕PU上寫程序。
因?yàn)槟阆胍?jì)算出復(fù)雜的光照算法,你一定會(huì)想在GPU上計(jì)算而不是像過去一樣在CPU上解決。
所以老OpenGL和現(xiàn)代OpenGL最重要的區(qū)別在于是否有可編程著色器。