glGen*vs glCreate*命名约定

5 opengl

我浏览了OpenGL标准,寻找对此的解释...为什么有些对象(着色器对象)使用以前缀glCreate开头的函数,有些对象(缓冲对象)使用以前缀glGen开头的函数?这有语义原因吗?

dat*_*olf 11

这些glGen…函数返回到OpenGL-1.1(glGenTextures),用于创建对象名称而不实际初始化对象.但是大多数情况下,这些函数一次只用于创建一个对象名.因此,不是传递指向缓冲区的指针和缓冲区的大小,而是大多数时候只返回一个整数.

当3Dlabs引入GLSL时,他们试图打破旧的glGen…惯例来实现OpenGL API的现代化.

是的,这有点无关紧要,坦率地说,我更喜欢GLSL API使用glGen…命名约定.但是,我们坚持glCreateShaderglCreateProgram,就是这样.

如果您想要一个命名约定,您可以编写以下包装器:

GLuint glCreateTexture(void) { GLuint name; glGenTextures(1, &name); return name; }
GLuint glCreateBuffer(void) { GLuint name; glGenTextures(1, &name); return name; }
...
Run Code Online (Sandbox Code Playgroud)

  • 这个答案肯定可以使用OpenGL 4.5和direct_state_access的更新,因为我们现在同时拥有glGenTextures和glCreateTextures。 (2认同)
  • @RobertWang:API命名约定并不是真正的建议。但是DSA方法将“旧资料”与较新资料的API对齐。DSA的主要优点是,由于具有100%的DSA代码库(由于DSA是一个相当新的开发,因此至今尚未找到),您不必再担心全局状态了……这简化了很多事情。如果您将无约束纹理投入混合,则您将非常接近Vulkan,D3D12或Metal。 (2认同)

dca*_*has 7

从OpenGL 4.5开始,我的理解是glCreate*函数通常用于在OpenGL 4.5中引入的直接状态访问函数,而glGen*需要在使用之前绑定相应的缓冲区,数组,纹理等.直到那时他们还没有初始化.

例如来自https://www.opengl.org/sdk/docs/man4/html/

glGenVertexArrays(...)数组中返回的名称仅标记为已使用,仅用于glGenVertexArrays,但它们仅在首次绑定时才获取状态和类型.

glCreateVertexArrays返回数组中先前未使用的顶点数组对象名称,每个对象名称表示初始化为默认状态的新顶点数组对象.

有人可能会说glCreateProgram也有意义.如果它产生初始化对象,则它与语法的其余部分一致.