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ū)別在于是否有可編程著色器公浪。