gpt4 book ai didi

OpenGL - GLenum 如何成为无符号 32 位整数?

转载 作者:行者123 更新时间:2023-12-02 03:19:14 24 4
gpt4 key购买 nike

首先,OpenGL 中有 8 种类型的缓冲区对象:

  • GL_ARRAY_BUFFER​
  • GL_ELEMENT_ARRAY_BUFFER​
  • GL_COPY_READ_BUFFER
  • ...

它们是枚举,或者更具体地说是 GLenum 的。其中 GLenum 是一个无符号 32 位整数,可以说其值高达 ~ 4,743,222,432。

缓冲区对象的大多数使用都涉及将它们绑定(bind)到某个目标,如下所示:例如

glBindBuffer(GL_ARRAY_BUFFER,缓冲区[大小]);

[void glBindBuffer(GLenum 目标,GLuint 缓冲区)] 文档

我的问题是 - 如果它是一个枚举,它的唯一值必须分别是 0,1,2,3,4..7 那么为什么要一直将其设为 32 位整数(如果它只有向上的值)到7?请原谅我对 CS 和 OpenGL 的了解,这似乎不道德。

最佳答案

枚举不仅仅用于缓冲区 - 任何地方都需要符号常量。目前,已分配数千个枚举值(查看您的 GL.h 和最新的 glext.h 。请注意,供应商已分配其官方枚举范围,以便他们可以实现特定于供应商的扩展,而不会干扰其他扩展 - 因此 32 位枚举空间是这不是一个坏主意。此外,在现代 CPU 架构上,使用低于 32 位的数据不会提高效率,因此这不是性能方面的问题。

更新:正如 Andon M. Coleman 指出的那样,目前仅分配 16 位枚举范围。链接到 OpenGL Enumerant Allocation Policies 可能会有用。 ,其中还有以下注释:

Historically, enumerant values for some single-vendor extensions were allocated in blocks of 1000, beginning with the block [102000,102999] and progressing upward. Values in this range cannot be represented as 16-bit unsigned integers. This imposes a significant and unnecessary performance penalty on some implementations. Such blocks that have already been allocated to vendors will remain allocated unless and until the vendor voluntarily releases the entire block, but no further blocks in this range will be allocated.

其中大部分似乎已被删除,以支持 16 位值,但 32 位值已被使用。在当前的 glext.h 中,仍然可以找到一些高于 0xffff 的(过时的)枚举,例如

#ifndef GL_PGI_misc_hints
#define GL_PGI_misc_hints 1
#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8
#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD
#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE
...

关于OpenGL - GLenum 如何成为无符号 32 位整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20829607/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com