title: OpenGL(1)初探
date: 2020-06-28 7:30
category: 圖形學
tags: opengl
https://hashwaney.github.io/
1.OpenGL是什麼?
一般它被認爲是一個API(Application Programming Interface,應用程序編程接口),包含了一系列可以操作圖形,圖像的函數,但是可惜的是OpenGL本身並不是一個API,它是一個由Khronos組織制定並維護的規範。
規定了每個函數該如何執行,以及它們的輸出值,至於內部具體每個函數是如何實現的,將由OpenGL庫的開發者(顯卡的生廠商)自行決定
2.核心模式與立即渲染模式介紹
立即渲染模式(Immediate mode,固定渲染管線)是一種早期的OpenGL渲染模式,
優點:繪製圖形方便.
缺點:大多數功能被庫隱藏起來,靈活性不高,效率低下。
從OpenGL3.2開始,規範文檔開始廢棄了立即渲染模式。
核心模式(Core-profile):使用現代函數,具有更高的靈活性和效率,但是更難於學習。
3.擴展什麼?
OpenGL的一大特性就是對擴展(Extension)的支持,場景如下:
當顯卡公司提出一個新特性或渲染上的大優化,通常以擴展的方式在驅動中實現,因此開發者不需要等待一個新的OpenGL規範面世,就可以使用這些新的渲染特性。
//僞代碼如下:
if (GL_ARB_extension_name)
{
//使用硬件支持的全新的現代特性
}else{
//不支持此擴展:用舊的方式去做
}
4.狀態機的概念
OpenGL自身是一個巨大的狀態機(State Machine): 擁有一系列的變量(state)描述OpenGL此刻應當如何運行,那麼OpenGL的狀態通常被稱爲OpenGL上下文。
狀態如何設置:設置選項,操作緩衝,最後利用當前狀態進行渲染;
具體如下:比如告訴OpenGL去畫線段而不是三角形的時候,通過改變一些上下文變量來改變OpenGL狀態,從而告訴OpenGL如何去繪製圖,
比如改變OpenGL的狀態爲繪製線段,那麼下一個繪製命令就是畫出線段而不是三角形。
5.OpenGL中的對象
OpenGL中的對象指的一些選項的集合,即OpenGL狀態的子集。
具體解釋:使用一個對象來代表繪製窗口的設置(其實就是一個設置窗口的選項,上述的概念就對應起來了),對象肯定有屬性,那麼後續設置窗口的大小,支持的顏色位數等等信息
編程風格:C風格的結構體
struct object_name{
float option1;
int option2;
char[] name;
}
實例演示:
// OpenGl的狀態
struct OpenGL_Context{
//....
object* object_window_Taret;
//....
}
//創建對象
unsigned int objectId =0;
glGenObject(1,&objectId);
//綁定對象上下文(狀態,創建一個window)
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時常見的工作流;
-
1.創建一個對象
-
2.然後用一個id保存它的引用(實際數據存儲在後臺)
-
3.將對象綁定在上下文的目標位置
-
4.設置上下文的選項
-
5.最後將目標上下文的對象id設置爲0,解綁這個對象。
設置的選項將被保存在objectId所引用的對象中,一旦重新綁定這個對象到目標上下文,這些選項會重新生效,這樣就不用重複去設置選項了