OpenGL入門(二)-- 快速了解OpenGL下的專業(yè)名詞

跟隨著我們上一篇文章《OpenGL入門(一)-- 圖形API簡(jiǎn)介與作用
的腳步跷乐,我們來大概了解一下OpenGL下的相關(guān)名詞解釋,當(dāng)然食零,這些解釋不一定是官方解釋版本辜羊,我就是這么隨便,有些地方加上了自己的一些理解意義斜友,主要是方便自己查閱炸裆,學(xué)習(xí)過程很重要啊。鲜屏。烹看。

OpenGL上下文(context)

  • 在應(yīng)?程序調(diào)?任何OpenGL的指令之前,首先會(huì)創(chuàng)建一個(gè)OpenGL的上下文洛史。這個(gè)上下?是一個(gè)?非常龐?的狀態(tài)機(jī)惯殊,保存了了OpenGL中的各種狀 態(tài),是OpenGL指令執(zhí)行的基礎(chǔ)也殖。
  • OpenGL的函數(shù)不管由哪種語言調(diào)用土思,都是面向過程的函數(shù),本質(zhì)上都是對(duì)OpenGL上下文狀態(tài)機(jī)中的某個(gè)狀態(tài)或者對(duì)象進(jìn)行相應(yīng)的操作忆嗜,前提是需要把這個(gè)對(duì)象設(shè)置為當(dāng)前對(duì)象己儒。因此,通過對(duì)OpenGL指令的封裝捆毫,將OpenGL的相關(guān)調(diào)用封裝成為一個(gè)面向?qū)ο蟮膱D形API闪湾。
  • OpenGL的上下文是一個(gè)很復(fù)雜且巨大的狀態(tài)機(jī),切換上下文的時(shí)候绩卤,會(huì)產(chǎn)生比較大的開銷途样,因?yàn)椴煌睦L制模塊,可能會(huì)使用完全獨(dú)立的狀態(tài)管理濒憋。所以娘纷,可以在應(yīng)用程序中分別創(chuàng)建多個(gè)不同的上下文,在不同的線程中使用不同的上下文跋炕,上下文之間共享紋理赖晶、緩沖區(qū)等資源。對(duì)比反復(fù)切換上下文辐烂,或者大量修改渲染狀態(tài)遏插,要更合理且高效一些。

OpenGL狀態(tài)機(jī)

概念

狀態(tài)機(jī)是一種理論上的機(jī)器纠修,它描述了一個(gè)對(duì)象在其生命周期內(nèi)所經(jīng)歷的各種狀態(tài)胳嘲,也可以說狀態(tài)機(jī)是一種行為,說明對(duì)象在其生命周期中響應(yīng)事件所經(jīng)歷的狀態(tài)序列以及對(duì)狀態(tài)事件的響應(yīng)扣草。

特點(diǎn)

  • 有記憶功能了牛,可以記住其當(dāng)前的狀態(tài)颜屠。
  • 可以接收輸入,根據(jù)輸入的內(nèi)容和自己的原先狀態(tài)鹰祸,修改自己當(dāng)前的狀態(tài)甫窟,并且可以有對(duì)應(yīng)的輸出。
  • 當(dāng)進(jìn)入特殊狀態(tài)(停機(jī)狀態(tài))的時(shí)候蛙婴,不在接收輸入粗井,停止工作。

理解(主要類比OpenGL街图,因?yàn)槲覀兊哪繕?biāo)就是要玩OpenGL??)

  • 在OpenGL中浇衬,OpenGL可以記錄自己的狀態(tài),如當(dāng)前所用的顏色餐济,是否開啟了混合功能等耘擂。
  • OpenGL可以接收輸入,當(dāng)調(diào)用OpenGL函數(shù)的時(shí)候絮姆,可以看出是OpenGL在接收我們的輸入梳星。
    OpenGL可以進(jìn)入停止?fàn)顟B(tài),不在接收輸入滚朵,在程序退出前冤灾,OpenGL總會(huì)先停止工作。

渲染(Rendering)

將圖形/圖像數(shù)據(jù)轉(zhuǎn)換成3D空間的圖像辕近。

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

  • 畫圖一般是先畫圖像的骨架韵吨,然后往骨架里面填充顏色,OpenGL也是一樣的移宅,頂點(diǎn)數(shù)據(jù)就是要畫的圖像的骨架归粉,只是OpenGL的圖像骨架是由圖元組成。在OpenGL ES中漏峰,由點(diǎn)糠悼、線、三角形三種基本的圖元組成浅乔,一般來說頂點(diǎn)數(shù)據(jù)(頂點(diǎn)數(shù)組)存儲(chǔ)在內(nèi)存中倔喂,而性能更高的做法是提前分配一塊顯存,將頂點(diǎn)數(shù)據(jù)預(yù)先傳入到顯存中靖苇,這部分的顯存即為頂點(diǎn)緩沖區(qū)席噩。
  • 頂點(diǎn)指的是在繪制一個(gè)圖形時(shí)的頂點(diǎn)位置數(shù)據(jù),這個(gè)數(shù)據(jù)可以直接存儲(chǔ)在數(shù)組中或者緩存到GPU內(nèi)存中贤壁。

管線

  • 使用OpenGL渲染圖形悼枢,有經(jīng)歷一個(gè)個(gè)的節(jié)點(diǎn),這樣的操作即可理解為管線脾拆,它是一個(gè)比較抽象的概念馒索,之所以被稱為管線莹妒,是因?yàn)轱@卡在處理數(shù)據(jù)的時(shí)候是按照一個(gè)固定的順序來的。

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

  • 在早期的OpenGL版本中绰上,封裝了很多著色器程序塊內(nèi)置的一段包含了光照旨怠、坐標(biāo)轉(zhuǎn)換、裁剪等諸多功能的固定shader程序來幫助開發(fā)者完成圖形的渲染渔期,開發(fā)者只需要傳入相應(yīng)的參數(shù)就能快速的完成圖形的渲染运吓。
  • 由于OpenGL的使用場(chǎng)景非常豐富渴邦,固定管線或存儲(chǔ)著色器無法完成每一個(gè)業(yè)務(wù)疯趟,這時(shí)將相關(guān)部分開放成可編程。

著色器程序Shader

  • 將固定的渲染管線架構(gòu)變?yōu)榱丝删幊啼秩竟芫€谋梭,OpenGL在實(shí)際調(diào)用繪制函數(shù)之前信峻,還需要指定一個(gè)由shader編譯成的著色器程序。常見的著色器主要有頂點(diǎn)著色器(VertexShader)瓮床,片元著色器(FragmentShader)/像素著色器(PixelShader)盹舞、幾何著色器(GeometryShader)、曲面細(xì)分著色器(TessellationShader)隘庄。直到OpenGL ES 3.0踢步,依然只支持了頂點(diǎn)著色器和片元著色器這2個(gè)最基礎(chǔ)的著色器。
  • OpenGL在處理shader時(shí)丑掺,和其他編譯器一樣获印,需要通過編譯、鏈接等步驟街州,生成了著色器程序(glProgram)兼丰,著色器程序同時(shí)包含了頂點(diǎn)著色器和片段著色器的運(yùn)算邏輯。OpenGL進(jìn)行繪制的時(shí)候唆缴,首先由頂點(diǎn)著色器對(duì)傳入的頂點(diǎn)數(shù)據(jù)進(jìn)行運(yùn)算鳍征,再通過圖元裝配,將頂點(diǎn)轉(zhuǎn)換為圖元面徽,然后進(jìn)行光柵化艳丛,將圖元這種矢量圖形轉(zhuǎn)換為柵格化數(shù)據(jù),最后趟紊,將柵格化的數(shù)據(jù)傳入片元著色器中進(jìn)行運(yùn)算质礼,片元著色器會(huì)對(duì)柵格化的數(shù)據(jù)中的每一個(gè)像素進(jìn)行運(yùn)算,并決定像素的顏色织阳。

頂點(diǎn)著色器VertexShader

  • 一般用于處理圖形每個(gè)頂點(diǎn)變換(旋轉(zhuǎn)/平移/投影等)眶蕉。
  • 頂點(diǎn)著色器是OpenGL中用于計(jì)算頂點(diǎn)屬性的程序,頂點(diǎn)著色器是逐頂點(diǎn)運(yùn)算的程序唧躲,也就是說每個(gè)頂點(diǎn)數(shù)據(jù)都會(huì)執(zhí)行一次頂點(diǎn)著色器造挽,這是并行的碱璃,且頂點(diǎn)著色器運(yùn)算過程中無法訪問其他頂點(diǎn)的數(shù)據(jù)。
  • 一般來說典型的需要計(jì)算的頂點(diǎn)屬性主要包括頂點(diǎn)坐標(biāo)變換饭入、逐頂點(diǎn)光照運(yùn)算等等嵌器,頂點(diǎn)坐標(biāo)由自身坐標(biāo)系轉(zhuǎn)換到歸一化坐標(biāo)系的運(yùn)算也在這里發(fā)生。

片元著色器程序FragmentShader

  • 一般用來處理圖形中每個(gè)像素點(diǎn)顏色計(jì)算和填充谐丢。
  • 片元著色器是OpenGL中用于計(jì)算片段(像素)顏色的程序爽航,是逐像素運(yùn)算的程序,也就是說每個(gè)像素都會(huì)執(zhí)行一次片段著色器乾忱,當(dāng)然也是并行的讥珍。

GLSL(OpenGL Shading Language)

OpenGL著色語言,是用來在OpenGL中著色編程的語言窄瘟,它們是在圖形卡GPU(Graphic Processor Unit圖形處理單元)上執(zhí)行的衷佃,代替了固定的渲染管線的一部分,使渲染管線中不同層次具有可編程形蹄葱,如視圖轉(zhuǎn)換氏义、投影轉(zhuǎn)換等,GLSL的著色器代碼分成2個(gè)部分:Vertex Shader(頂點(diǎn)著色器)和Fragment Shader(片元著色器)图云。

光柵化(Rasterization)

  • 把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為片元的過程惯悠,具有將圖轉(zhuǎn)化為一個(gè)個(gè)柵格組成的圖像的作用,特點(diǎn)是每個(gè)元素對(duì)應(yīng)幀緩沖區(qū)中的一像素竣况。
  • 光柵化其實(shí)是一種將幾何圖元變?yōu)槎S圖像的過程克婶,該過程包含了兩部分的工作。第一部分:決定窗口坐標(biāo)中的哪些整型柵格區(qū)域被基本圖元占用帕翻;第二部分:分配一個(gè)顏色值和一個(gè)深度值到各個(gè)區(qū)域鸠补,光柵化過程產(chǎn)生的是片元。
  • 把物體的數(shù)學(xué)描述以及與物體相關(guān)的顏色信息轉(zhuǎn)換為屏幕上用于對(duì)應(yīng)位置的像素及用于填充像素的顏色嘀掸,這個(gè)過程成為光柵化紫岩,這是一個(gè)將模擬信號(hào)轉(zhuǎn)化為離散信號(hào)的過程。

紋理

紋理可以簡(jiǎn)單的理解為一張圖片睬塌,在渲染圖形時(shí)需要在其編碼填充圖片泉蝌,為了使得場(chǎng)景更加逼真,而這里使用的圖片揩晴,就是常說的紋理勋陪,但是在OpenGL中,我們更加習(xí)慣叫紋理硫兰,而不是圖片诅愚。

混合

在測(cè)試階段后,如果像素依然沒有被剔除劫映,那么像素的顏色將會(huì)和幀緩沖區(qū)中顏色附著上的顏色進(jìn)行混合违孝,混合的算法可以通過OpenGL的函數(shù)進(jìn)行指定刹前。但是OpenGL提供的混合算法是有限的,如果需要更復(fù)雜的混合算法雌桑,一般可以通過像素著色器進(jìn)行實(shí)現(xiàn)喇喉,當(dāng)然性能會(huì)比原生的混合算法要差一些。

變換矩陣(Transformation)

在圖形想發(fā)生平移校坑、縮放拣技、旋轉(zhuǎn)變換時(shí),就需要使用到變換矩陣耍目。

投影矩陣

用于將3D坐標(biāo)轉(zhuǎn)換為二維屏幕坐標(biāo)膏斤,實(shí)際線條也將在二維坐標(biāo)下進(jìn)行繪制。

渲染上屏/交換緩沖區(qū)(SwapBuffer)

  • 渲染緩沖區(qū)一般映射的是系統(tǒng)的資源比如窗口制妄,如果將圖像直接渲染到窗口對(duì)應(yīng)的渲染緩沖區(qū)掸绞,則可以將圖像顯示到屏幕上泵三。
  • 如果每一個(gè)窗口只有一個(gè)緩沖區(qū)耕捞,那么在繪制過程中屏幕進(jìn)行了刷新,窗口可能顯示出不完整的圖像烫幕,為了解決以上問題俺抽,常規(guī)的OpenGL程序至少都會(huì)有2個(gè)緩沖區(qū)。顯示在屏幕上的稱為屏幕緩沖區(qū)较曼,沒有顯示的稱為離屏緩沖區(qū)磷斧。在一個(gè)緩沖區(qū)渲染完成之后,通過將屏幕緩沖區(qū)和離屏幕緩沖區(qū)交換捷犹,實(shí)現(xiàn)圖像在屏幕上的顯示弛饭。
  • 由于顯示器的刷新一般都是逐行進(jìn)行的,因此為了防止交換緩沖區(qū)的時(shí)候屏幕上下區(qū)域的圖像分屬2個(gè)不同的幀萍歉,因此交換一般會(huì)等待顯示器刷新完成的信號(hào)侣颂,在顯示器兩次刷新的間隔中進(jìn)行交換,這個(gè)信號(hào)就被稱為垂直同步信號(hào)枪孩,這個(gè)技術(shù)被稱為垂直同步憔晒。
  • 在使用了雙緩沖區(qū)和垂直同步技術(shù)之后,由于總是要等待緩沖區(qū)交換之后再進(jìn)行下一幀的渲染蔑舞,使得幀率無法完全達(dá)到硬件允許的最高水平拒担。為了解決這個(gè)問題,引入了三緩沖區(qū)技術(shù)攻询,在等待垂直同步時(shí)从撼,來回交替渲染2個(gè)離屏的緩沖區(qū),而垂直同步發(fā)生時(shí)钧栖,屏幕緩沖區(qū)和最近渲染完成的離屏緩沖區(qū)交換低零,實(shí)現(xiàn)充分利用硬件性能的目的呆馁。

--
總結(jié):咱們說好了名詞解釋,就只是名詞解釋毁兆,絕不含糊浙滤,不會(huì)有相關(guān)代碼,流程圖的說明气堕,哈哈纺腊,,不要著急茎芭,后面會(huì)有的揖膜。。梅桩。

--
系列連載

OpenGL入門(一)-- 圖形API簡(jiǎn)介與作用
OpenGL入門(二)-- 快速了解OpenGL下的專業(yè)名詞
OpenGL入門(三)-- OpenGL坐標(biāo)系解析與坐標(biāo)變換
OpenGL入門(四)-- OpenGL坐標(biāo)系與坐標(biāo)變換
OpenGL入門(五)-- OpenGL渲染流程圖解析
OpenGL入門(六)-- OpenGL 固定存儲(chǔ)著色器的理解使用
OpenGL入門(七)-- 圖形圖像渲染中的深度緩沖區(qū)
OpenGL入門(八)-- OpenGL向量和矩陣簡(jiǎn)介
OpenGL入門(九)-- OpenGL 紋理簡(jiǎn)單介紹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末壹粟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宿百,更是在濱河造成了極大的恐慌趁仙,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垦页,死亡現(xiàn)場(chǎng)離奇詭異雀费,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)痊焊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門盏袄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人薄啥,你說我怎么就攤上這事辕羽。” “怎么了垄惧?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵刁愿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我赘艳,道長(zhǎng)酌毡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任蕾管,我火速辦了婚禮枷踏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掰曾。我一直安慰自己旭蠕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掏熬,像睡著了一般佑稠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上旗芬,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天舌胶,我揣著相機(jī)與錄音,去河邊找鬼疮丛。 笑死幔嫂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的誊薄。 我是一名探鬼主播履恩,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼呢蔫!你這毒婦竟也來了切心?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤片吊,失蹤者是張志新(化名)和其女友劉穎绽昏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體定鸟,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡而涉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年著瓶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了联予。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡材原,死狀恐怖沸久,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情余蟹,我是刑警寧澤卷胯,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站威酒,受9級(jí)特大地震影響窑睁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜葵孤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一担钮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尤仍,春花似錦箫津、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饼拍。三九已至,卻和暖如春田炭,著一層夾襖步出監(jiān)牢的瞬間师抄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工教硫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留司澎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓栋豫,卻偏偏與公主長(zhǎng)得像挤安,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丧鸯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359