我跟随" OpenGL Superbible"但我不能注意到,当我们创建着色器并创建我们将着色器附加到的程序时,我们将它们存储为无符号整数的GLuint。
为什么它们存储为数字?这个数字的价值是什么意思?
示例:
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);
答案 0 :(得分:6)
这些整数是句柄。这是许多API使用的常用习惯用法,用于通过不透明的间接级别隐藏资源访问。 OpenGL有效地阻止您在不使用API调用的情况下访问句柄后面的内容。
在计算机编程中,句柄是对资源的抽象引用。 [...]资源句柄可以是不透明的标识符,在这种情况下,它们通常是整数,或者它们可以是允许访问更多信息的指针。
答案 1 :(得分:1)
数字的值没有任何意义,0
除外,这意味着“没有对象”。
当您进行glGen*()
或glCreate*()
类型的调用时,驱动程序会生成这些值。它们是对象的不透明引用。您可以想象驱动程序维护这些数字与相应内部对象之间的映射。每次将数字作为参数传递给API调用时,例如glBind*()
,驱动程序将查找该数字,并将其映射回相应的内部对象。
从语义上讲,这非常类似于C / C ++中的指针。分配内存时,会得到一个指针。您可以使用此指针来引用您分配的内存。除了在OpenGL的情况下,你没有获得原始内存地址,而是一个不透明的表示来引用该对象。
在其他API中使用相同的概念。例如,Windows(Win32)广泛使用不透明的对象引用,它们称为“句柄”。
现在您可能想知道为什么OpenGL不会简单地使用指针而不是这些对象ID。这只是我个人的看法,但我认为主要的动机是OpenGL被设计为客户端/服务器API,其中渲染可以在与运行应用程序的机器不同的机器上进行。如果必须打包API流并通过网络发送,则使用指向引用对象的指针不起作用。在这种情况下,使用不透明的id会更清晰。
BTW,在官方OpenGL术语中,这些值大多称为“名称”。我总是觉得有点误导,因为大多数人在听到“名字”时会想到字符串。我自己大多称他们为“ids”。