首先,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,那么,如果它的最大枚举值最多为7,为什么要一直使用它并使其成为32位整数?请原谅我对CS和OpenGL的了解,这似乎是不道德的。

    最佳答案

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

    更新:
    正如Andon M. Coleman指出的那样,当前仅分配16Bit枚举范围。链接到OpenGL Enumerant Allocation Policies可能会很有用,它还有以下说明:



    其中大多数似乎已被删除,以支持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/

    10-14 06:28