5 opengl
我浏览了OpenGL标准,寻找对此的解释...为什么有些对象(着色器对象)使用以前缀glCreate开头的函数,有些对象(缓冲对象)使用以前缀glGen开头的函数?这有语义原因吗?
dat*_*olf 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; }
...
Run Code Online (Sandbox Code Playgroud)
从OpenGL 4.5开始,我的理解是glCreate*函数通常用于在OpenGL 4.5中引入的直接状态访问函数,而glGen*需要在使用之前绑定相应的缓冲区,数组,纹理等.直到那时他们还没有初始化.
例如来自https://www.opengl.org/sdk/docs/man4/html/
glGenVertexArrays(...)数组中返回的名称仅标记为已使用,仅用于glGenVertexArrays,但它们仅在首次绑定时才获取状态和类型.
glCreateVertexArrays返回数组中先前未使用的顶点数组对象名称,每个对象名称表示初始化为默认状态的新顶点数组对象.
有人可能会说glCreateProgram也有意义.如果它产生初始化对象,则它与语法的其余部分一致.
| 归档时间: |
|
| 查看次数: |
2865 次 |
| 最近记录: |