2015-06-22 20 views
2

我正在關注「OpenGL Superbible」一書,我不禁注意到,當我們創建着色器並創建我們附加着色器的程序時,我們將它們存儲爲無符號整數的GLuint。爲什麼着色器和程序以整數形式存儲在OpenGL中?

它們爲什麼以數字形式存儲?數字的價值是什麼意思?

例如:

GLuint vertex_shader; 
GLuint fragment_shader; 
GLuint program; 

// Create and compile vertex shader 
vertex_shader = glCreateShader(GL_VERTEX_SHADER); 
glShaderSource(vertex_shader, 1, vertex_shader_source, NULL); 
glCompileShader(vertex_shader); 

// Create program, attach shaders to it, and link it 
program = glCreateProgram(); 
glAttachShader(program, vertex_shader); 
glLinkProgram(program); 
+2

這些整數用於[句柄](https://en.wikipedia.org/wiki/Handle_(計算))的目的) –

+0

謝謝,這回答我的問題!由於Win32 API,我熟悉手柄。 :) – Jeffrey

回答

6

這些整數是處理。這是由許多API使用了常見的成語,用來隱藏通過間接的不透明級別的資源訪問權限。 OpenGL正在有效地阻止你訪問不使用API​​調用的句柄。

From Wikipedia

在計算機編程,手柄是一個抽象的參照的資源。 [...]資源句柄可以是不透明的標識符,在這種情況下,它們通常是整數,或者它們可以是允許訪問更多信息的指針。

1

數字的值表示什麼都沒有,除了0,意思是「沒有對象」。

這些值由驅動程序在製作glGen*()glCreate*()類型的調用時生成。它們是對象的不透明引用。你可以想象驅動程序維護這些數字和相應的內部對象之間的映射。每次您將該號碼作爲參數傳遞給API調用時,例如glBind*(),驅動程序將查找該數字,並將其映射回相應的內部對象。

從語義上講,這非常像C/C++中的指針。當你分配內存時,你會得到一個指針。你可以使用這個指針來引用你分配的內存。除了OpenGL,你不會得到一個原始的內存地址,而是一個不透明的表示來引用這個對象。

在其他API中使用了相同的概念。例如,Windows(Win32)廣泛使用不透明的對象引用,它們稱之爲「手柄」。

現在您可能想知道爲什麼OpenGL不會簡單地使用指針而不是這些對象ID。這只是我個人的看法,但我相信主要動機是OpenGL被設計爲客戶端/服務器API,其中渲染可能發生在與運行應用程序的機器不同的機器上。如果API流必須打包並通過網絡發送,則使用指向引用對象的指針並不容易。在這種情況下使用不透明的ID更清潔。

順便說一下,在官方的OpenGL術語中,這些值通常被稱爲「名稱」。我總覺得有點誤導,因爲大多數人在聽到「名字」時會想到字符串。我大多稱自己爲「ids」。

+0

非常感謝您的回答。真的清除了一些東西了! – Jeffrey