OpenGL之旅(1):初探

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所引用的對象中,一旦重新綁定這個對象到目標上下文,這些選項會重新生效,這樣就不用重複去設置選項了

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