为什么统一变量没有glBindAttribLocation()等效?

时间:2014-04-15 17:57:35

标签: opengl uniform

我正在学习OpenGL并注意到在处理输入属性时我可以选择使用glGetAttribLocation()glBindAttribLocation()但是对于制服,我必须使用glGetUniformLocation()。是否有任何技术原因未在API中包含glBindUniformLocation()

1 个答案:

答案 0 :(得分:6)

对于初学者来说,除了调用类似glUniform* (...)的函数来设置制服的值之外,没有其他事情可以用它们来做。 GLSL之前不存在制服。

OpenGL中的属性位置可以追溯到GL_ARB_vertex_program汇编语言(其中attribs。有数字而不是名字)。实际上,当它首次添加到GL时,这些索引别名为传统的固定函数指针(例如 0 == glVertexPointer (...) 2 < / strong> == glNormalPointer (...) 3 == glColorPointer (...))以便顶点程序可以轻松地放入现有应用程序中。 GLSL重新使用了汇编语言扩展所开创的API部分(这种情况发生了很多)。

值得一提的是,在GLSL中,在兼容的实现中只保证/允许1个别名,并且 0 (许多驱动程序,特别是NV,别名比此更多)。混合和匹配固定功能和可编程顶点属性时,重要的是要避免使用别名指向别名的索引,这需要手动设置位置。

更重要的是,显式设置通用顶点属性位置的能力使得GLSL程序适应刚性定义的数据更加方便。为了匹配顶点着色器的预期接口,不是设置一组不同的顶点指针,而是编译/链接GLSL程序以匹配顶点数据的布局通常更容易。

这种行为对于制服来说并不那么重要,但是, Uniform Buffers的形式具有类似功能 。您可以将统一缓冲区绑定到(您选择的)可共享位置,并在所有GLSL程序中重用其统一块中的所有值。实际上,此功能最初是以名称为GL_EXT_bindable_uniform

的扩展名形式引入的