OpenGL學習之路(1)

原地址:https://learnopengl-cn.github.io/01%20Getting%20started/01%20OpenGL/
一、基本概念

  1. 狀態機
    OpenGL自身是一個巨大的狀態機(State Machine):一系列的變量描述OpenGL此刻應當如何運行。OpenGL的狀態通常被稱爲OpenGL上下文(Context)。我們通常使用如下途徑去更改OpenGL狀態:設置選項,操作緩衝。最後,我們使用當前OpenGL上下文來渲染

    假設當我們想告訴OpenGL去畫線段而不是三角形的時候,我們通過改變一些上下文變量來改變OpenGL狀態,從而告訴OpenGL如何去繪圖。一旦我們改變了OpenGL的狀態爲繪製線段,下一個繪製命令就會畫出線段而不是三角形。

    當使用OpenGL的時候,我們會遇到一些狀態設置函數(State-changing Function),這類函數將會改變上下文。以及狀態使用函數(State-using Function),這類函數會根據當前OpenGL的狀態執行一些操作。只要你記住OpenGL本質上是個大狀態機,就能更容易理解它的大部分特性。

  2. 對象
    OpenGL庫是用C語言寫的,同時也支持多種語言的派生,但其內核仍是一個C庫。由於C的一些語言結構不易被翻譯到其它的高級語言,因此OpenGL開發的時候引入了一些抽象層。“對象(Object)”就是其中一個。

    在OpenGL中一個對象是指一些選項的集合,它代表OpenGL狀態的一個子集。比如,我們可以用一個對象來代表繪圖窗口的設置,之後我們就可以設置它的大小、支持的顏色位數等等。可以把對象看做一個C風格的結構體(Struct):

struct object_name {
    float  option1;
    int    option2;
    char[] name;
};

當我們使用一個對象時,

// OpenGL的狀態
struct OpenGL_Context {
    ...
    object* object_Window_Target;
    ...     
};
// 創建對象
unsigned int objectId = 0;
glGenObject(1, &objectId);
// 綁定對象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 設置當前綁定到 GL_WINDOW_TARGET 的對象的一些選項
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 將上下文對象設回默認
glBindObject(GL_WINDOW_TARGET, 0);

這一小段代碼展現了你以後使用OpenGL時常見的工作流。我們首先創建一個對象,然後用一個id保存它的引用(實際數據被儲存在後臺)。然後我們將對象綁定至上下文的目標位置(例子中窗口對象目標的位置被定義成GL_WINDOW_TARGET)。接下來我們設置窗口的選項。最後我們將目標位置的對象id設回0,解綁這個對象。設置的選項將被保存在objectId所引用的對象中,一旦我們重新綁定這個對象到GL_WINDOW_TARGET位置,這些選項就會重新生效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章