第十二課 OpenGL擴充套件

2021-07-10 00:09:16 字數 2443 閱讀 7266

gpu的效能隨著更新換代一直在提高,支援渲染更多的三角形和畫素點。然而,原始效能不是我們唯一關心的。nvidia, amd和intel也通過增加功能來改善他們的顯示卡。來看一些例子。

回溯到2023年,gpu都沒有頂點著色器或片斷著色器:所有的一切都硬編碼在晶元中。這被稱為固定功能流水線(fixed-function pipeline (ffp))。同樣地,當時最新的opengl 1.3中也沒有介面可以建立、操作和使用所謂的」著色器」,因為它根本不存在。接著nvidia決定用實際**描述渲染過程,來取代數以百計的標記和狀態量。這就是arb_fragment_program的由來。當時還沒有glsl,但你可以寫這樣的程式:

1 !!arbfp1.0 mov result.color, fragment.color; end
但若要顯式地令opengl使用這些**,你需要一些還不在opengl裡的特殊函式。在進行解釋前,再舉個例子。

好,你說『arb_fragment_program太老了,所以我不需要擴充套件這東西』?其實有不少新的擴充套件非常方便。其中乙個便是arb_debug_output,它提供了乙個不存在於opengl 3.3中的,但你可以/應該用到的功能。它定義了像gl_debug_output_synchronous_arb或gl_debug_severity_medium_arb之類的字串,和debugmessagecallbackarb這樣的函式。這個擴充套件的偉大之處在於,當你寫了一些不正確的**,例如:

1 glenable(gl_texture); // incorrect ! you probably meant gl_texture_2d !
你能得到錯誤訊息和錯誤的精確位置。總結:

『手動』查詢乙個擴充套件的方法是使用以下**片斷 (**opengl.org wiki):

1 int numberofextensions;

2 glgetintegerv(gl_num_extensions, &numberofextensions);

3 for(i=0; i4 const glubyte *ccc=glgetstringi(gl_extensions, i);

5 if ( strcmp(ccc, (const glubyte *)"gl_arb_debug_output") == 0 )

10 }

上面的方式太複雜。若用glew, glee, gl3w這些庫,就簡單多了。例如,有了glew,你只需要在建立視窗後呼叫glewinit(),不少方便的變數就建立好了:

1 if (glew_arb_debug_output)
(小心:debug_output是特殊的,因為你需要在上下文建立的時候啟用它。在glfw中,這通過glfwopenwindowhint(glfw_opengl_debug_context, 1)完成。)

擴充套件的名字暗示了它的適用範圍:

gl_:所有平台; glx_:只有linux和mac下可使用(x11); wgl_:只有windows下可使用。

ext:通用的擴充套件。 arb:已經被opengl架構評審委員會的所有成員接受(ext擴充套件沒多久後就經常被提公升為arb)的擴充套件。 nv/amd/intel:顧名思義 =)

比方說,你的opengl 3.3應用程式需要渲染一些大型線條。你能夠寫乙個複雜的頂點著色器來完成,或者簡單地用gl_nv_path_rendering,它能幫你處理所有複雜的事。

因此你可以這樣寫**:

1 if ( glew_nv_path_rendering )else
當使用擴充套件的益處(如渲染質量、效能),超過維護兩種不同方法(如上面的**,一種靠你自己實現,一種使用擴充套件)的代價時,通常就選擇用擴充套件。

例如,在時空幻境(braid, 乙個時空穿越的二維遊戲)中,當你干擾時間時,就會有各種各樣的影象變形效果,而這種效果在舊硬體上沒法渲染。

而在opengl 3.3及更高版本中,包含了99%的你可能會用到的工具。一些擴充套件很有用,比如gl_amd_pinned_memory,雖然它通常沒法像幾年前使用gl_arb_framebuffer_object(用於紋理渲染)那樣讓你的遊戲看起來變好10倍。

如果你不得不相容老硬體,那麼就不能用opengl 3+,你需要用opengl 2+來代替。你將不再能使用各種神奇的擴充套件了,你需自行處理那些問題。

更多的細節可以參考例子opengl 2.1版本的第14課 - 紋理渲染,第152行,需手動檢查gl_arb_framebuffer_object是否存在。常見問題可見faq。

opengl擴充套件提供了乙個很好的方式來增強opengl的功能,它依賴於你使用者的gpu。

雖然現在擴充套件屬於高階用法(因為大部分功能在核心中已經有了),了解擴充套件如何運作和怎麼用它提高軟體效能(付出更高的維護代價)還是很重要的。

演算法導論 第十二課 跳躍表

本節課介紹了一種全新的資料結構 跳躍表 跳躍表是一種簡單又有趣的動態搜尋資料結構,其主要優點在於其易於實現,而且很好的保證了其具有高效的效能,即2 o lgn 的搜尋效能 在此之前我想首先談談鍊錶,鍊錶的優點在於其插入和刪除只需要常數項的時間 加上查詢該元素需要額外的o n 時間 但是其查詢效率只有...

libcurl第十二課 記憶體分析

在實際的測試環境中,內存在不斷的增長,儘管不是很明顯 申請記憶體分析 struct curl multi curl multi handle int hashsize,socket hash int chashsize connection hash 該函式建立了curl muti結構體,並且申請了...

VB6 0(第十二課時)

一 錯誤型別 一 編譯錯誤 即語法錯誤,由於 結構違反了語句的語法規定而產生的錯誤,如缺少關鍵字 if text1.text label1.caption 你好 endif 二 執行錯誤 在程式編譯通過後執行 時發生的,一般是由於程式執行過程 現了非法操作引起的。如,除法中除數為0 型別不匹配 訪問...