快速了解OpenGL下的專(zhuān)業(yè)名詞

正所謂摸到不誤砍柴工侥啤,我們?cè)趯W(xué)習(xí)OPenGL API之前凳宙,我們先來(lái)了解下OpenGL下的專(zhuān)業(yè)名詞是用來(lái)做什么的,可以加深我們對(duì)OPenGL的理解职祷。

?OpenGL上下文【context】

? ? A.在應(yīng)用程序調(diào)用任何OpenGL的指令之前氏涩,需要安排首先創(chuàng)建一個(gè)OpenGL的上下文。這個(gè)上下文是一個(gè)非常龐大的狀態(tài)機(jī)有梆,用來(lái)保存OpenGL中的各種狀態(tài)是尖,這也是OpenGL指令執(zhí)行的基礎(chǔ)。

? ??B.OpenGL的函數(shù)不管在那個(gè)語(yǔ)言中泥耀,都有類(lèi)似C語(yǔ)言一樣的面向過(guò)程的函數(shù)饺汹,本質(zhì)上都是對(duì)OpenGL上下文這個(gè)龐大的狀態(tài)機(jī)中的某個(gè)狀態(tài)或者對(duì)象進(jìn)行操作,當(dāng)然我們需要把這個(gè)對(duì)象設(shè)置為當(dāng)前對(duì)象痰催。因此兜辞,通過(guò)對(duì)OpenGL指令的封裝迎瞧,是可以將OpenGL的相關(guān)調(diào)用封裝成一個(gè)面向?qū)ο蟮膱D形API的。

? ??C.由于OpenGL上下文是一個(gè)巨大的狀態(tài)機(jī)逸吵,切換上下文往往會(huì)產(chǎn)生較大的開(kāi)銷(xiāo)凶硅,但是不同的繪制模塊,可能需要使用完全獨(dú)立的狀態(tài)管理扫皱。因此足绅,可以在應(yīng)用程序中分別創(chuàng)建多個(gè)不同的上下文,并且在不同線(xiàn)程中使用不同的上下文韩脑,上下文之間共享文理氢妈、緩沖區(qū)資源。這樣的方案段多,回避反復(fù)切換上下文首量,或者大量修改渲染狀態(tài),更加合理高效衩匣。

OpenGL狀態(tài)機(jī)
狀態(tài)機(jī)描述了一個(gè)對(duì)象在其生命周期內(nèi)所經(jīng)歷的各種狀態(tài)蕾总,狀態(tài)間的轉(zhuǎn)發(fā),發(fā)生轉(zhuǎn)變的原因琅捏,條件及轉(zhuǎn)變中所執(zhí)行的活動(dòng)生百。或者說(shuō)沒(méi)狀態(tài)機(jī)是一種行為柄延,說(shuō)明對(duì)象在其生命周期中響應(yīng)時(shí)間所經(jīng)歷的狀態(tài)徐柳以及對(duì)那些狀態(tài)時(shí)間的響應(yīng)蚀浆。因此它具有以下特點(diǎn):
? ? A.有記憶功能,可以記住其當(dāng)前所處的狀態(tài)(如當(dāng)前所有使用的顏色搜吧、是否開(kāi)啟了混合功能等)
? ? B.可以接受輸入市俊,根據(jù)輸入的內(nèi)容和自己原先狀態(tài),修改自己當(dāng)前狀態(tài)滤奈,并且可以對(duì)應(yīng)輸出(當(dāng)調(diào)用OpenGL函數(shù)的時(shí)候摆昧,實(shí)際上可以看成OpenGL在接受我們的輸入,如我們調(diào)用glcolor3f,則OpenGL接收到這個(gè)輸入后會(huì)修改自己的"當(dāng)前顏色"這個(gè)狀態(tài))
? ? C.當(dāng)進(jìn)入特殊狀態(tài)(停機(jī)狀態(tài))的時(shí)候蜒程,不再接受輸入绅你,停止工作(程序在退出前,OpenGL總會(huì)先停止工作的)

渲染:將圖形/圖像數(shù)據(jù)轉(zhuǎn)換成3的空間圖形操作叫做渲染(Rendering)昭躺。

頂點(diǎn)數(shù)組(VertexArray)和頂點(diǎn)緩沖區(qū)(VertexBuffer)

? ? A.畫(huà)圖一般是先畫(huà)好圖像的骨架忌锯,然后再往股價(jià)里面填充顏色,這對(duì)于OpenGL也是一樣的领炫。頂點(diǎn)數(shù)據(jù)就是要畫(huà)的圖像股價(jià)偶垮,和現(xiàn)實(shí)中不同的是,OpenGL中的圖像都是由圖元組成。在OpenGLES中似舵,有三種類(lèi)型的圖元:點(diǎn)脚猾、線(xiàn)、三角形啄枕。那些頂點(diǎn)數(shù)據(jù)最終是存儲(chǔ)在哪里的呢婚陪?開(kāi)發(fā)者可以選擇設(shè)定函數(shù)指針,在調(diào)用繪制方法的時(shí)候频祝,直接由內(nèi)存?zhèn)魅腠旤c(diǎn)數(shù)據(jù)泌参,也就是說(shuō)這部分?jǐn)?shù)據(jù)之前是存儲(chǔ)在內(nèi)存當(dāng)中的,被稱(chēng)為頂點(diǎn)數(shù)組常空。而性能更好的做法是沽一,提前分配一塊現(xiàn)存,在頂點(diǎn)數(shù)據(jù)預(yù)先傳入到現(xiàn)存當(dāng)中漓糙。這部分現(xiàn)存铣缠,被稱(chēng)為頂點(diǎn)緩沖區(qū)。
? ? B.頂點(diǎn)指的是我們?cè)诶L制一個(gè)圖形時(shí)昆禽,他的頂點(diǎn)位置數(shù)據(jù)蝗蛙。而這個(gè)數(shù)據(jù)可以直接存儲(chǔ)在數(shù)組中或者將其緩存到GPU內(nèi)存中。

管線(xiàn):在OpenGL下渲染圖形醉鳖,就會(huì)要經(jīng)歷一個(gè)一個(gè)節(jié)點(diǎn)捡硅。而這樣的操作可以理解管線(xiàn)。我們把它可以想象成流水線(xiàn)盗棵。每個(gè)任務(wù)類(lèi)似流水線(xiàn)般執(zhí)行壮韭,任務(wù)之間有先后順序。管線(xiàn)是一個(gè)抽象的概念纹因,之所以稱(chēng)之為管線(xiàn)是因?yàn)轱@卡在處理數(shù)據(jù)的時(shí)候是按照一個(gè)固定順序來(lái)工作的喷屋,并且嚴(yán)格按照這個(gè)順序,這個(gè)順序是不能被打破的瞭恰。

固定管線(xiàn)/存儲(chǔ)著色器

? ? A.在早期的OpenGL版本屯曹,它封裝了很多種著色器程序塊內(nèi)置的一段包含了光照、坐標(biāo)變換惊畏、裁剪等等諸多功能的固定shader程序來(lái)完成是牢,幫助開(kāi)發(fā)者來(lái)完成圖形的渲染。而開(kāi)發(fā)者只需要傳入相應(yīng)的參數(shù)陕截,就能快速的完成圖形的渲染。類(lèi)似于iOS開(kāi)發(fā)會(huì)封裝很多API批什。而我們只需要調(diào)用就可以實(shí)現(xiàn)功能农曲,不需要關(guān)注底層的實(shí)現(xiàn)原理。
? ? B.由于OpenGL的使用場(chǎng)景分廠(chǎng)豐富。固定管線(xiàn)/存儲(chǔ)著色器無(wú)法完成每一個(gè)業(yè)務(wù)乳规。這時(shí)將相關(guān)部分開(kāi)放為可編程形葬。

著色器程序Shader

? ? A.全面的將固定渲染管線(xiàn)架構(gòu)編程了可編程渲染管線(xiàn)。因此暮的,OpenGL在實(shí)際調(diào)用繪制函數(shù)之前笙以,還需要制定一個(gè)由shader變異稱(chēng)為著色器程序。常見(jiàn)得著色器主要有頂點(diǎn)著色器(vertexShader),片元著色器(FragmentShader)/像素著色器(PixelShader),幾何著色器(GeometryShader)冻辩,曲面細(xì)分著色器(TessellationShader)猖腕。片元著色器和像素著色器在OpenGL和DirectX中不同叫法而已『奚粒可惜的是倘感,直到OpenGLES3.0,依然只支持了頂點(diǎn)著色器和片元著色器這兩個(gè)最基礎(chǔ)的著色器咙咽。? ??

? ? B.OpenGL在處理shader時(shí)老玛,和其他編譯器一樣。通過(guò)編譯钧敞,鏈接等步驟蜡豹,生成了著色器程序(glProgram)簇捍,著色器程序同時(shí)包含了頂點(diǎn)著色器和片元著色器的運(yùn)算邏輯居夹。在OpenGL進(jìn)行繪制的時(shí)候漠另,首先由頂點(diǎn)著色器對(duì)傳入的頂點(diǎn)數(shù)據(jù)進(jìn)行運(yùn)算挚冤。再通過(guò)圖元裝配远搪,將頂點(diǎn)轉(zhuǎn)化為圖元缝其。然后進(jìn)行光柵化搜变,將圖元這種矢量圖形缅茉,裝換為柵格化數(shù)據(jù)凤巨。最后视乐,將柵格化數(shù)據(jù)傳入片元著色器進(jìn)行運(yùn)算(片元著色器對(duì)柵格化數(shù)據(jù)中的每一個(gè)像素進(jìn)行運(yùn)算,并決定像素顏色)敢茁。

頂點(diǎn)著色器VertexShader
? ? A.一般用來(lái)處理圖形每個(gè)頂點(diǎn)變化(旋轉(zhuǎn)/平移/投影等)佑淀。、
? ? B.頂點(diǎn)著色器是OpenGL中用于計(jì)算頂點(diǎn)屬性的程序彰檬。頂點(diǎn)著色器是逐頂點(diǎn)運(yùn)算的程序伸刃,也就是說(shuō)每個(gè)頂點(diǎn)數(shù)據(jù)都會(huì)執(zhí)行頂點(diǎn)著色器,當(dāng)然這是并行的逢倍,并且頂點(diǎn)著色器運(yùn)算過(guò)程中無(wú)法訪(fǎng)問(wèn)其他頂點(diǎn)數(shù)據(jù)捧颅。
? ? C.一般來(lái)說(shuō)典型需要計(jì)算的頂點(diǎn)屬性主要包括定點(diǎn)坐標(biāo)變換、逐頂點(diǎn)光照運(yùn)算等等较雕,頂點(diǎn)坐標(biāo)由自身坐標(biāo)系轉(zhuǎn)換到歸一化坐標(biāo)的運(yùn)算碉哑。

片元著色器程序FragmentShader
? ? ?A.一般用來(lái)處理圖形中每個(gè)像素點(diǎn)顏色計(jì)算和填充
? ? ?B.片元著色器是OpenGL中用于計(jì)算片元(像素)顏色的程序挚币。片元著色器是逐像素運(yùn)算的程序,也就是說(shuō)每個(gè)像素都會(huì)執(zhí)行一次片元著色器扣典,當(dāng)然也是并行的

GLSL(OpenGL Shading Language)是用來(lái)在OpenGL中著色編程語(yǔ)言妆毕,也是開(kāi)發(fā)人員寫(xiě)的自定義程序,他們?cè)趫D形卡的GPU(Graphic Processor Unit圖形處理單元)上執(zhí)行贮尖。代替了固定的渲染管線(xiàn)的一部分笛粘,使渲染管線(xiàn)中不同層次具有可編程性。(比如:視圖轉(zhuǎn)換湿硝、投影轉(zhuǎn)換等薪前。GLSL的著色器代碼分為2個(gè)部分:VertexShader 和 FragmentShader)

光柵化Rasterization
? ? A.柵格化就是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為片元的過(guò)程。片元中的每一個(gè)元素對(duì)應(yīng)幀緩沖區(qū)中的每一個(gè)像素
? ? B.光柵化其實(shí)是一種將集合圖元變?yōu)槎S圖像的過(guò)程图柏。該過(guò)程包含了兩部分工作序六。第一部分工作:決定窗口坐標(biāo)中的哪些整型柵格區(qū)域被基本圖元占用;第二部分工作:分配一個(gè)顏色值和一個(gè)深度值到各個(gè)區(qū)域蚤吹。光柵化產(chǎn)生的片元(像素)
? ? C.把物體的數(shù)學(xué)描述以及與物體相關(guān)的顏色信息轉(zhuǎn)換為屏幕上用于對(duì)應(yīng)位置的像素及用于填充像素的顏色例诀,這個(gè)過(guò)程稱(chēng)為光柵化,這是一個(gè)將模擬信號(hào)轉(zhuǎn)化為離散信號(hào)的過(guò)程

紋理
? ? 文理可以理解為圖片裁着,大家在渲染圖形時(shí)需要在其編碼填充圖片繁涂,為了使得場(chǎng)景更加逼真。而這里使用的圖片木九十常說(shuō)的文理二驰,但是在OpenGL中我們更加習(xí)慣叫文理扔罪,而不是圖片。

混合(Blending)
? ? 在測(cè)試階段之后桶雀,如果像素依然沒(méi)有被剔除矿酵,那么像素的顏色將會(huì)和幀緩沖區(qū)中顏色附著上的顏色進(jìn)行混合,混合的算法可以通過(guò)OpenGL的函數(shù)進(jìn)行制定矗积。但是OpenGL提供的混合算法是有限的全肮,如果需要更加復(fù)雜的混合算法,一般可以通過(guò)像素著色器進(jìn)行實(shí)現(xiàn)棘捣,當(dāng)然性能會(huì)比原生的混合算法差一些辜腺。

變換矩陣(Transformation)
? ? 例如圖形想發(fā)生平移,縮放乍恐,旋轉(zhuǎn)變換评疗,就需要使用變換矩陣。

投影舉證(Projection)
? ? 用于將3D坐標(biāo)系轉(zhuǎn)換為二維屏幕坐標(biāo)茵烈,實(shí)際線(xiàn)條也將在二維坐標(biāo)系下進(jìn)行繪制百匆。

渲染上屏/交換緩沖區(qū)(SwapBuffer)
? ? A.渲染緩沖區(qū)一般映射的是系統(tǒng)的資源比如窗口。如果將圖像直接渲染到窗口對(duì)應(yīng)的渲染緩沖區(qū)呜投,則可以將圖像顯示到屏幕上胧华。
? ? B.但是寄症,值得注意的是,如果每個(gè)窗口只有一個(gè)緩沖區(qū)矩动,那么繪制過(guò)程中屏幕進(jìn)行了刷新,窗口可能顯示出不完整的圖形
? ? C.為了解決這個(gè)問(wèn)題释漆,常規(guī)的OpenGL程序至少都會(huì)有兩個(gè)緩沖區(qū)悲没。顯示在屏幕上的稱(chēng)為屏幕緩沖區(qū)男图,沒(méi)有顯示的稱(chēng)為離屏緩沖區(qū)示姿。在一個(gè)緩沖區(qū)渲染完成之后沒(méi)通過(guò)將屏幕緩沖區(qū)和離屏緩沖區(qū)交換,實(shí)現(xiàn)圖像在屏幕上的顯示
? ? D.由于顯示器的刷新一般是逐行進(jìn)行的逊笆,因此為了防止交換緩沖區(qū)的時(shí)候屏幕上下區(qū)域的圖像分屬于兩個(gè)不同的幀栈戳,因此交換一般會(huì)等待顯示器刷新完成信號(hào),在顯示器兩次刷新間隔中進(jìn)行交換难裆,這個(gè)信號(hào)被稱(chēng)為垂直同步(vsync)
????????垂直同步(VerticalSync)子檀,又叫場(chǎng)同步(VerticalHold),它指的是讓顯卡輸出信號(hào)與顯示器刷新的頻率同步乃戈,在游戲或者驅(qū)動(dòng)程序面板中打開(kāi)這個(gè)功能褂痰,顯卡繪制3D圖形前會(huì)等待垂直同步信號(hào),顯示器什么時(shí)候刷新症虑,顯卡就什么時(shí)候輸出信號(hào)缩歪。

? ? ? ? 理論上開(kāi)啟垂直同步可以讓顯卡與顯示器同步輸出信號(hào),但問(wèn)題在于顯卡自身輸出的幀數(shù)(FPS)跟顯示器的刷新率并不相等谍憔,不同顯卡渲染游戲的幀數(shù)是不一樣的匪蝙,高端顯卡渲染游戲可以輕松超過(guò)100fps,這樣的話(huà)開(kāi)啟垂直同步习贫,顯示器正常只會(huì)顯示60fps逛球,多余的幀數(shù)就無(wú)效了,造成性能浪費(fèi)沈条。(筆者現(xiàn)在打游戲用的顯卡是 1080需忿,之前用的顯示器最大幀刷新率只有60,導(dǎo)致顯卡無(wú)法發(fā)揮1080的強(qiáng)大蜡歹,所以狠下心買(mǎi)了臺(tái)144HZ顯示器屋厘,現(xiàn)在打吃雞和CSGO的時(shí)候比以前舒服多了~~~
? ? ?E.使用了雙緩沖區(qū)和垂直同步技術(shù)之后,由于終是要等待緩沖區(qū)交換后再進(jìn)行下一幀的渲染月而,使得幀率無(wú)法完全達(dá)到硬件允許的最高水平汗洒。為了解決這個(gè)問(wèn)題,引入了三緩沖區(qū)技術(shù)父款,在等待垂直同步時(shí)溢谤,來(lái)回交替渲染兩個(gè)離屏的緩沖區(qū)瞻凤,兒垂直同步發(fā)生時(shí),屏幕緩沖區(qū)和最近渲染完成的離屏緩沖區(qū)交換世杀,實(shí)現(xiàn)充分利用硬件性能的目的阀参。

? ?


????以上為OpenGL相關(guān)的專(zhuān)業(yè)名詞解析,了解這些知識(shí)點(diǎn)讓我們?cè)趶氖翺penGL開(kāi)發(fā)時(shí)更得心應(yīng)手瞻坝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛛壳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子所刀,更是在濱河造成了極大的恐慌衙荐,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浮创,死亡現(xiàn)場(chǎng)離奇詭異忧吟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)斩披,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)溜族,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人雏掠,你說(shuō)我怎么就攤上這事斩祭。” “怎么了乡话?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵摧玫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我绑青,道長(zhǎng)诬像,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任闸婴,我火速辦了婚禮坏挠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘邪乍。我一直安慰自己降狠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布庇楞。 她就那樣靜靜地躺著榜配,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吕晌。 梳的紋絲不亂的頭發(fā)上蛋褥,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音睛驳,去河邊找鬼烙心。 笑死膜廊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的淫茵。 我是一名探鬼主播爪瓜,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼匙瘪!你這毒婦竟也來(lái)了钥勋?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辆苔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后扼劈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體驻啤,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年荐吵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了骑冗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡先煎,死狀恐怖贼涩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情薯蝎,我是刑警寧澤遥倦,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站占锯,受9級(jí)特大地震影響袒哥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜消略,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一堡称、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧艺演,春花似錦却紧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至哩照,卻和暖如春挺物,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背飘弧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工识藤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砚著,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓痴昧,卻偏偏與公主長(zhǎng)得像稽穆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赶撰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容