c++ - 为什么所有 openGL 对象都存储在 GLuints 中?

标签 c++ pointers opengl

我最好的猜测是 GLuint 持有一个指针而不是对象,因此它可以“持有”任何对象,因为它实际上只是持有一个指向内存空间的指针

但如果这是真的,为什么我在使用这些变量时不需要取消引用任何东西?

最佳答案

OpenGL object名字是handles引用 OpenGL 对象。它们不是“指针”;它们只是指定特定对象的唯一标识符。对于每种对象类型,OpenGL 实现都有对象名称和实际内部对象存储之间的映射。

这种二分法的存在是出于遗留的历史原因。

第一个 OpenGL 对象类型是显示列表。您使用 glNewList function 创建了许多新的显示列表.这个函数不会你对象的名字;您告诉它 实现 将使用的整数名称范围。

这是二分法的根本原因:用户决定名称是什么,实现将用户指定的名称映射到实现定义的数据。唯一的限制是您不能使用相同的名称两次。

为下一个 OpenGL 对象类型稍微修改了显示列表范例:纹理。在新范例中,有一个函数允许实现为您创建名称:glGenTextures。但是这个功能是可选的。您可以对任何您想要的整数 调用glBindTexture,并且实现将在那一刻创建一个映射到该整数名称的纹理对象。

随着新对象类型的创建,OpenGL 为它们保留了纹理范例。它们具有 glGen* 函数,但它们是可选的,因此用户可以指定他们想要的任何名称。

Shader objects有点偏离,因为它们的Create 函数不允许 允许您选择名称。但他们仍然使用整数,因为......即使不一致,API 一致性也很重要(请注意,GLSL 着色器对象的扩展版本使用指针,但核心版本决定不使用)。

当然,核心 OpenGL 完全取消了用户提供的名称。但是如果不基本上创建一个新的 API,它就无法摆脱作为概念的整数对象名称。虽然核心 OpenGL 是一个兼容性问题,但它的设计是这样的,如果你“正确”地编写你的前核心 OpenGL 代码,它仍然可以在核心 OpenGL 中工作。也就是说,核心 OpenGL 代码应该是有效的兼容 OpenGL 代码。

阻力最小的方法是不创建新的 API,即使它 makes the API really silly .

关于c++ - 为什么所有 openGL 对象都存储在 GLuints 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69543457/

相关文章:

C++模板函数,替换失败跳过实现

c++ - QSql数据库 : QMYSQL driver not loadedQSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7

c - 返回指针的函数声明

c++ - OpenGL GL_UNPACK_ALIGNMENT

opengl - 渲染到立方体贴图

c++ - 仅允许特定类型的成员函数

c++ - WNetGetUniversalName 的问题

c++ - 模块化快速排序实现 (C++)

c - 如何将 memmove 与指针的指针一起使用?

linux - 如何知道 opengl 函数是否会阻塞?