我浏览了OpenGL标准寻找解释...为什么有些对象(着色器对象)使用以前缀 glCreate 开头的函数和一些对象(缓冲对象)使用以前缀 glGen 开头的函数?这有语义原因吗?
答案 0 :(得分:11)
glGen…
函数返回OpenGL-1.1(glGenTextures
)并用于创建对象名称而不实际初始化对象。但是大多数情况下,这些函数一次只用于创建一个对象名。因此,不是传递指向缓冲区的指针和缓冲区的大小,而是大多数时候只返回一个整数。
当3Dlabs引入GLSL时,他们试图打破旧的glGen…
约定来实现OpenGL API的现代化。
是的,这有点无关紧要,坦率地说,我更喜欢GLSL API使用glGen…
命名约定。但我们仍然坚持使用glCreateShader
和glCreateProgram
,就是这样。
如果您想要一个命名约定,您可以编写以下包装器:
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也有意义。如果它产生一个初始化对象,则它与语法的其余部分一致。