10多年前,曾經(jīng)計(jì)劃在博客上寫一個(gè)OpenGL的系列介紹,只開了個(gè)頭,后來不了了之了。當(dāng)時(shí)好像還換過幾個(gè)不同的博客網(wǎng)站,都記不得了。想了一下,還是可以大概的搜索回來,稍作合并整理,發(fā)在這里,做個(gè)記錄。
考察計(jì)算機(jī)顯卡最后輸出到顯示器的環(huán)節(jié),有一塊和屏幕分辨率大小一致的連續(xù)memory,有一個(gè)名為Display Controller的硬件設(shè)備,該硬件將memory中的數(shù)據(jù)傳遞給顯示器,進(jìn)而在顯示器屏幕screen顯示。此時(shí),這塊memory被稱為on screen buffer。換句話說,可以存在多塊memory,其內(nèi)容都可以被Display Controller傳給顯示設(shè)備,而當(dāng)前被Display Controller傳輸數(shù)據(jù)的那塊memory就是on screen buffer。如下圖所示。

所以,我們要探討的是,如何決定on screen buffer中數(shù)據(jù)的變化,從而在屏幕發(fā)生影像變化。有以下三種情況,如下圖所示。

1.最樸素的想法是,用數(shù)碼相機(jī)拍下,然后將照片piture加載到buffer中,但無法滿足計(jì)算機(jī)世界的各種要求。
2.進(jìn)一步考慮,最終屏幕顯示的其實(shí)是一副2維(2d/2D)圖片,所以,通過繪制一個(gè)平面上的點(diǎn)線面,即可在屏幕上得到任意輸出。一般來說,諸如菜單等在底層都可以用這種方法繪制的(vista及其之后的3D桌面除外)。
但是,這種2D方法在諸如游戲虛擬現(xiàn)實(shí)等領(lǐng)域存在嚴(yán)重缺陷。比如,在一個(gè)游戲場景中,稍微動(dòng)一下鼠標(biāo)改變視角,看到的整個(gè)場景就會(huì)發(fā)生變化,那每次的微小變動(dòng),游戲軟件就要花費(fèi)大量的CPU時(shí)間來計(jì)算改變后的場景應(yīng)該是怎么樣的,然后再繪制一系列的2D點(diǎn)線面來完成。
所以,3D顯卡應(yīng)運(yùn)而生,原先要占用CPU的大量計(jì)算都由3D顯卡完成。上個(gè)世紀(jì)的顯卡大部分都是2D顯卡,而現(xiàn)在主流的桌面顯卡則都是以3D為主同時(shí)包括2D功能,純2D功能的顯卡在服務(wù)器中還存在。
3.從專業(yè)術(shù)語上來說,3D顯卡中主要就是一個(gè)3D Pipeline,可以將pipeline理解為處理過程、流水線處理過程等,總之可以看做一個(gè)復(fù)雜模塊而已。
3D Pipeline接收3D信息,諸如物體的空間信息,眼睛所在位置的幾何信息,視角的角度等等;輸出的則是最終將在屏幕上顯示的2D數(shù)據(jù)。也就是說,如果要繪制三維空間中的物體,表現(xiàn)出它們的燈影效果,體現(xiàn)出移步換景、定點(diǎn)換景、定景換點(diǎn)的觀察效果,最終在二維的屏幕上顯示,就需要用到3D技術(shù)了。
業(yè)界3D的標(biāo)準(zhǔn)主要有兩個(gè),一個(gè)是微軟的Direct3D(簡稱D3D),另一個(gè)則是OpenGL (OpenGL Graphics Library,可簡稱為GL)和OpenGL ES(OpenGL Embeded System)。而現(xiàn)在新出現(xiàn)了一個(gè)新的標(biāo)準(zhǔn)Vulkan。OpenGL、OpenGL ES和Vulkan都是Khronos旗下,如果說OpenGL是盡量的屏蔽細(xì)節(jié),向上提供一個(gè)較高層次的API接口,那么Vulkan則是盡量的暴露出更多的底層接口,使得驅(qū)動(dòng)之上的應(yīng)用程序可以更好的挖掘硬件性能。
不管用上述哪種方法得到的新數(shù)據(jù),如果新數(shù)據(jù)用來直接修改on screen buffer中的數(shù)據(jù),可能會(huì)出現(xiàn)閃爍現(xiàn)象。如果將新數(shù)據(jù)填入另一個(gè)buffer中,然后在合適的時(shí)機(jī),將這另一個(gè)buffer的內(nèi)容一次性的拷貝到on screen buffer中,這個(gè)方法被稱為blit;如果在合適時(shí)機(jī),將這另一個(gè)buffer作為on screen buffer交由Display Controller輸出,這種方法叫flip,此時(shí),原先的on screen buffer就失去了on screen的屬性,成為一塊普通的buffer了。全屏程序,適合使用flip方法,因?yàn)榻粨Q的兩塊buffer的大小格式等屬性都是相同的。而現(xiàn)在增加了諸如window manager進(jìn)行composition的情況,又有所不同了。
以上內(nèi)容是本人業(yè)余時(shí)間興趣之作,限于水平,差錯(cuò)難免,僅代表個(gè)人觀點(diǎn),和本人任職公司無關(guān)。
本文首發(fā)于微信公眾號(hào):那遁去的一