Dre*_*Orc 3 c++ opengl pointers
我最好的猜测是 GLuint 持有一个指针而不是对象,因此它可以“持有”任何对象,因为它实际上只是持有一个指向内存中空间的指针
但如果这是真的,为什么我在使用这些变量时不需要取消引用任何内容?
OpenGL 对象名称是引用 OpenGL 对象的句柄。它们不是“指针”;而是“指针”。它们只是指定特定对象的唯一标识符。对于每种对象类型,OpenGL 实现都有一个对象名称和实际内部对象存储之间的映射。
这种二分法的存在是由于遗留的历史原因。
第一个 OpenGL 对象类型是显示列表。glNewList您使用该函数创建了许多新的显示列表。该函数不会为您提供对象的名称;而是为您提供对象的名称。您告诉它实现将使用的整数名称范围。
这是二分法的根本原因:用户决定名称是什么,实现从用户指定的名称映射到实现定义的数据。唯一的限制是您不能两次使用相同的名称。
对于下一个 OpenGL 对象类型:纹理,显示列表范例稍作修改。在新范例中,有一个函数允许实现为您创建名称:glGenTextures。但这个功能是可选的。您可以调用glBindTexture任何您想要的整数,并且实现将在那一刻创建一个映射到该整数名称的纹理对象。
当新的对象类型被创建时,OpenGL 为它们保留了纹理范例。它们具有glGen*功能,但它们是可选的,以便用户可以指定他们想要的任何名称。
着色器对象有点不同,因为它们的Create功能不允许您选择名称。但他们仍然使用整数,因为……即使不一致,API 一致性也很重要(请注意,GLSL 着色器对象的扩展版本使用指针,但核心版本决定不这样做)。
当然,核心 OpenGL 完全废除了用户提供的名称。但如果不创建一个新的 API,它就无法摆脱整数对象名称这一概念。虽然核心 OpenGL 存在兼容性问题,但它的设计目的是,如果您“正确”编码了预核心 OpenGL 代码,它仍然可以在核心 OpenGL 中工作。也就是说,核心 OpenGL 代码也应该是有效的兼容性 OpenGL 代码。
阻力最小的方法就是不要创建新的 API,即使这会让 API 变得非常愚蠢。