【问题标题】:Why are all openGL objects stored in GLuints?为什么所有 openGL 对象都存储在 GLuints 中?
【发布时间】:2021-12-01 05:20:39
【问题描述】:

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

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

【问题讨论】:

  • 这些值是 not 指针,因此不应取消引用。它们如何映射到 OpenGL 中的“对象”是一个我们并不真正需要知道的神秘黑匣子。
  • OpenGL 在GLuints 中持有“句柄”(内部数据结构的索引)——它们可以引用 OpenGL 驱动程序或视频卡等中的某些内容。它们不应该被“取消引用” "或以其他方式操纵。 OpenGL 驱动程序知道这些“句柄”代表什么,它们应该只传递给正确的 API 调用。如果您将它们传递给错误的 API 调用,那么您将破坏 API 合同。
  • 简答:这不是真的。

标签: c++ pointers opengl


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2016-05-08
    • 2022-01-26
    • 2020-06-26
    相关资源
    最近更新 更多