为什么OpenGL函数使用GLuint和GLint混合属性位置/索引?

时间:2017-06-10 13:28:28

标签: opengl

我正在尝试编写一个非常简单的OpenGL程序,并且我对使用GLint / GLuint的混合感到有些困惑。

glGetAttribLocation将属性位置(索引?)作为GLint返回,而

glVertexAttribPointer接受GLuint作为属性索引。为什么两者都不使用相同的类型?

2 个答案:

答案 0 :(得分:3)

这与这些功能的词源有关。

glVertexAttribPointer未专门为GLSL创建。它最初来自ARB_vertex_program,这是旧的程序集着色语言扩展。 glVertexAttribPointer使用了无符号属性索引。此外,它从未有过查询属性索引的API;毕竟,它是用于汇编,您将属性索引直接硬编码到着色器中。你为什么要查询你提供的东西?

因此,GLSL首先由ARB_shader_object扩展名定义(由3D Labs的人员编写,一个幸运的已解散组织,考虑他们使用GLSL制作的所有错误 )。他们使用签名整数作为他们的位置。请注意,glUniform*ARB函数均采用GLint而不是GLuint。所以GLSL一直使用有符号整数来做这类事情。

但是,ARB_vertex_program已经具有向顶点着色器指定属性数组的功能。他们的ARB_vertex_shader扩展只使用了我们已有的扩展,而不是创建一系列完全相同的新功能。这使得现有代码能够相对轻松地使用GLSL。

但它造成了这种不一致,因为GLSL扩展都使用GLint,而glVertexAttribPointer使用GLuint

答案 1 :(得分:0)

  

如果name以保留前缀“gl_”开头,则返回值-1。

它处理错误案例。