OpenGL - GLenum如何是无符号的32位整数?

Use*_*job 5 opengl enums opengl-4

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

  • GL_ARRAY_BUFFER
  • GL_ELEMENT_ARRAY_BUFFER
  • GL_COPY_READ_BUFFER
  • ...

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

缓冲区对象的大多数用法都涉及将它们绑定到某个目标,例如:

glBindBuffer(GL_ARRAY_BUFFER,Buffers [size]);

[void glBindBuffer(GLenum target,GLuint buffer)]文档

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

der*_*ass 6

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

更新: 正如Andon M. Coleman指出的那样,目前只有16Bit的枚举范围被分配.在OpenGL Enumerant Allocation Policies中链接可能很有用,它也有以下注释:

从历史上看,某些单供应商扩展的枚举值是以块为单位分配的,从块[102000,102999]开始向上进行.此范围中的值不能表示为16位无符号整数.这对某些实现施加了显着且不必要的性能损失.已经分配给供应商的这些块将保持分配,除非并且直到供应商自愿释放整个块,但不会分配此范围内的其他块.

其中大多数似乎已被删除,支持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
...
Run Code Online (Sandbox Code Playgroud)