OpenGL和狀態(tài)機
狀態(tài)機
狀態(tài)機(State Machine)是一種抽象的計算模型,用于描述系統(tǒng)在不同狀態(tài)之間的轉(zhuǎn)換和行為。它由一組狀態(tài)和規(guī)定狀態(tài)轉(zhuǎn)換條件的規(guī)則組成。
在狀態(tài)機中,系統(tǒng)的行為和狀態(tài)是密切相關(guān)的。系統(tǒng)可以處于不同的狀態(tài),每個狀態(tài)都代表系統(tǒng)在某個時間點上的特定情況或條件。狀態(tài)機定義了系統(tǒng)可以接受的事件(輸入),以及如何根據(jù)當(dāng)前狀態(tài)來轉(zhuǎn)換到新的狀態(tài)。狀態(tài)之間的轉(zhuǎn)換是通過滿足特定的條件觸發(fā)的。
OpenGL
OpenGL自身是一個巨大的狀態(tài)機,它的設(shè)計哲學(xué)基于狀態(tài)機模型——一系列的變量描述OpenGL此刻應(yīng)當(dāng)如何運行。在使用OpenGL時,你需要設(shè)置各種狀態(tài)和參數(shù),然后調(diào)用繪制命令來渲染圖形。這些狀態(tài)和參數(shù)包括圖形屬性、光照設(shè)置、材質(zhì)屬性、視角變換等等。
一旦你設(shè)置了這些狀態(tài)和參數(shù),OpenGL就會根據(jù)它們的值來執(zhí)行繪制命令。這些狀態(tài)的改變會影響后續(xù)的渲染結(jié)果。換句話說,OpenGL的行為取決于當(dāng)前的狀態(tài)。
舉個例子,你可以設(shè)置繪制顏色、光照強度、模型視圖矩陣等狀態(tài)。然后,每次調(diào)用繪制命令時,OpenGL會根據(jù)這些狀態(tài)的值來確定如何渲染圖形。如果你在繪制之前修改了某個狀態(tài),它將影響后續(xù)的繪制結(jié)果,直到你再次改變它。
OpenGL的狀態(tài)通常被稱為OpenGL上下文(Context)。我們通常使用如下途徑去更改OpenGL狀態(tài):設(shè)置選項,操作緩沖。最后,我們使用當(dāng)前OpenGL上下文進行渲染。
假設(shè)當(dāng)我們想告訴OpenGL去畫線段而不是三角形的時候,我們通過改變一些上下文變量來改變OpenGL狀態(tài),從而告訴OpenGL如何去繪圖。一旦我們改變了OpenGL的狀態(tài)為繪制線段,下一個繪制命令就會畫出線段而不是三角形。
當(dāng)使用OpenGL的時候,我們會遇到一些狀態(tài)設(shè)置函數(shù)(State-changing Function),這類函數(shù)將會改變上下文,以及狀態(tài)使用函數(shù)(State-using Function),這類函數(shù)會根據(jù)當(dāng)前OpenGL的狀態(tài)執(zhí)行一些操作。
只要記住OpenGL本質(zhì)上是個狀態(tài)機,就能更容易理解它的大部分特性。