glGen * vs glCreate *命名约定

时间:2014-06-26 22:48:03

标签: opengl

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

2 个答案:

答案 0 :(得分: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; }
...

答案 1 :(得分:7)

自OpenGL 4.5以来,我的理解是glCreate *函数通常用于OpenGL 4.5中引入的直接状态访问函数,而glGen *需要先绑定各自的缓冲区,数组,纹理等。被使用,因为它们在那之前是未初始化的。

e.g。来自https://www.opengl.org/sdk/docs/man4/html/

  

glGenVertexArrays (...)数组中返回的名称仅标记为已使用,仅用于glGenVertexArrays,但只有在第一次绑定时才会获取状态和类型。

     

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

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