OpenGL-上下文和狀態(tài)機(jī)

OpenGL上下文

  • OpenGL本身就是一個(gè)非常龐大的狀態(tài)機(jī)(State Machine) ,其狀態(tài)通常被稱為OpenGL上下文(Context)。它里面保存了一系列的變量用來描述OpenGL此刻需要如何運(yùn)行,比如拍照時(shí)候要開啟濾鏡功能等等。
  • OpenGL使用C語言編寫的,進(jìn)而他的Api的封裝也都是面向過程的,其函數(shù)本質(zhì)上都是對(duì)OpenGL上下文狀態(tài)機(jī)中的某個(gè)狀態(tài)或者對(duì)象進(jìn)行操作
  • 應(yīng)用程序中可以創(chuàng)建多個(gè)不同的上下文,他們分別在各自的線程中使用。上下文之間共享紋理,緩沖區(qū)等資源,采用這中方案更為高效,因?yàn)樗苊饬朔磸?fù)切換上下文,或者大量修改渲染狀態(tài)所造成的較大的開銷。

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

狀態(tài)機(jī)是理論上的一種機(jī)器,我是結(jié)合自己的工作經(jīng)歷去理解這個(gè)概念(括號(hào)里面的內(nèi)容)。

什么是狀態(tài)機(jī)

  • 狀態(tài)機(jī)描述了一個(gè)對(duì)象(我)在其生命周期(事業(yè)發(fā)展)內(nèi)所經(jīng)歷的各種狀態(tài)(公司/行業(yè)),狀態(tài)間的轉(zhuǎn)變(跳槽/創(chuàng)業(yè)),發(fā)生轉(zhuǎn)變的動(dòng)因(離職/轉(zhuǎn)行的原因),條件及轉(zhuǎn)變中所執(zhí)行的活動(dòng)(關(guān)系網(wǎng)建立+學(xué)習(xí)+面試)。
  • 狀態(tài)機(jī)是一種行為,說明對(duì)象在其生命周期中響應(yīng)事件所經(jīng)歷的狀態(tài)序列以及對(duì)那些狀態(tài)事件的響應(yīng)(個(gè)人簡(jiǎn)歷中體現(xiàn)事業(yè)發(fā)展線,和對(duì)于行業(yè)變革做出的相應(yīng))。

狀態(tài)機(jī)的特點(diǎn)有哪些

  • 它有記憶功能:能夠記住自己當(dāng)前的狀態(tài)。
  • 它可以接收輸入:根據(jù)輸入的內(nèi)容和自己的狀態(tài),修改自己的狀態(tài),并且可以得到輸出。
  • 當(dāng)它進(jìn)入某個(gè)特殊的狀態(tài)如停機(jī)狀態(tài)的時(shí)候,它不再接收輸入,停止工作。

足球停球有點(diǎn)類似?!
O(∩_∩)O哈哈~ 試著理解下~

就像是足球運(yùn)動(dòng)員在場(chǎng)上奔跑時(shí)接收到了隊(duì)友的傳球時(shí),他會(huì)根據(jù)自己當(dāng)前的位置(記憶功能)以及足球過來的角度和力量(接收輸入),做出相應(yīng)動(dòng)作的調(diào)整(修改自己的狀態(tài)),然后將球停在自己腳下(得到輸出)。最后當(dāng)比賽結(jié)束或其他原因至運(yùn)動(dòng)員下場(chǎng)了便不再響應(yīng)這件事(不再接收輸入)。

類推到OpenGL中的狀態(tài)機(jī)

  • OpenGL可以記錄自己的狀態(tài),比如下面的這幾行代碼(比如:當(dāng)前所使用的顏色、是否開啟了混合功能,等等,這些都是要記錄的)
glClearColor(1.0,1.0,1.0.1.0);

glEnable(GL_DEPTH_TEST);//開啟深度測(cè)試
glDisable(GL_DEPTH_TEST);//關(guān)閉深度測(cè)試

glEnable(GL_BLEND);//開啟混合
glDisable(GL_BLEND)//關(guān)閉混合
  • OpenGL可以接收輸入(當(dāng)我們調(diào)用OpenGL函數(shù)的時(shí)候,實(shí)際上可以看成OpenGL在接收我們的輸入),根據(jù)輸入的內(nèi)容和自己的狀態(tài),修改自己的狀態(tài),并且可以得到輸出(比如我們調(diào)用glColor3f,則OpenGL接收到這個(gè)輸入后會(huì)修改自己的“當(dāng)前顏色”這個(gè)狀態(tài);我們調(diào)用glRectf,則OpenGL會(huì)輸出一個(gè)矩形)
  • OpenGL可以進(jìn)入停止?fàn)顟B(tài),不再接收輸入。這個(gè)可能在我們的程序中表現(xiàn)得不太明顯,不過在程序退出前,OpenGL總會(huì)先停止工作的。

總的來講,“狀態(tài)機(jī)”可以簡(jiǎn)化這個(gè)描述:OpenGL是一個(gè)狀態(tài)機(jī),它保持自身的狀態(tài),除非用戶輸入一條命令讓它改變狀態(tài)。

顏色、紋理坐標(biāo)、源因子和目標(biāo)因子、光源的各種參數(shù),等等,這些都是狀態(tài),所以這一句話就包含了上面敘述的所有內(nèi)容。
此外,“是否啟用了光照”、“是否啟用了紋理”、“是否啟用了混合”、“是否啟用了深度測(cè)試”等等,這些也都是狀態(tài),也符合上面的描述:OpenGL會(huì)保持狀態(tài),除非我們調(diào)用OpenGL函數(shù)來改變它。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容