为什么着色器和程序在OpenGL中存储为整数?

时间:2015-06-22 06:54:27

标签: c++ opengl opengl-es integer shader

我跟随" 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);

2 个答案:

答案 0 :(得分:6)

这些整数是句柄。这是许多API使用的常用习惯用法,用于通过不透明的间接级别隐藏资源访问。 OpenGL有效地阻止您在不使用API​​调用的情况下访问句柄后面的内容。

From Wikipedia

  

在计算机编程中,句柄是对资源的抽象引用。 [...]资源句柄可以是不透明的标识符,在这种情况下,它们通常是整数,或者它们可以是允许访问更多信息的指针。

答案 1 :(得分:1)

数字的值没有任何意义,0除外,这意味着“没有对象”。

当您进行glGen*()glCreate*()类型的调用时,驱动程序会生成这些值。它们是对象的不透明引用。您可以想象驱动程序维护这些数字与相应内部对象之间的映射。每次将数字作为参数传递给API调用时,例如glBind*(),驱动程序将查找该数字,并将其映射回相应的内部对象。

从语义上讲,这非常类似于C / C ++中的指针。分配内存时,会得到一个指针。您可以使用此指针来引用您分配的内存。除了在OpenGL的情况下,你没有获得原始内存地址,而是一个不透明的表示来引用该对象。

在其他API中使用相同的概念。例如,Windows(Win32)广泛使用不透明的对象引用,它们称为“句柄”。

现在您可能想知道为什么OpenGL不会简单地使用指针而不是这些对象ID。这只是我个人的看法,但我认为主要的动机是OpenGL被设计为客户端/服务器API,其中渲染可以在与运行应用程序的机器不同的机器上进行。如果必须打包API流并通过网络发送,则使用指向引用对象的指针不起作用。在这种情况下,使用不透明的id会更清晰。

BTW,在官方OpenGL术语中,这些值大多称为“名称”。我总是觉得有点误导,因为大多数人在听到“名字”时会想到字符串。我自己大多称他们为“ids”。