【发布时间】:2014-04-15 17:57:34
【问题描述】:
我正在学习 OpenGL,并注意到在处理输入属性时我可以选择使用 glGetAttribLocation() 或 glBindAttribLocation(),但对于制服,我必须使用 glGetUniformLocation()。 API 中不包含glBindUniformLocation() 是否有任何技术原因?
【问题讨论】:
我正在学习 OpenGL,并注意到在处理输入属性时我可以选择使用 glGetAttribLocation() 或 glBindAttribLocation(),但对于制服,我必须使用 glGetUniformLocation()。 API 中不包含glBindUniformLocation() 是否有任何技术原因?
【问题讨论】:
对于初学者来说,除了调用像glUniform* (...) 这样的函数来设置制服的值之外,您无法对它们做任何其他事情。在 GLSL 之前不存在制服。
OpenGL 中的属性位置可以追溯到 GL_ARB_vertex_program 汇编语言(其中 attribs. 有数字而不是名称)。事实上,当它第一次添加到 GL 时,这些索引别名为传统的固定函数指针(例如 0 == glVertexPointer (...), 2 == glNormalPointer (...), 3 == glColorPointer (...)) 以便可以轻松地将顶点程序放入现有应用程序中。 GLSL 重用了由汇编语言扩展开创的部分 API(这种情况经常发生)。
值得一提的是,在 GLSL 中,只有 1 个别名在兼容的实现中得到保证/允许,即 0(许多驱动程序,尤其是 NV,别名不止于此)。在混合和匹配固定功能和可编程顶点属性时,重要的是要避免索引与其他使用的指针有别名,这需要手动设置位置的能力。
更重要的是,显式设置通用顶点属性位置的能力使得 GLSL 程序适应严格定义的数据更加方便。与其设置一组不同的顶点指针来匹配顶点着色器的预期接口,通常更容易编译/链接 GLSL 程序以匹配顶点数据的布局。
这种行为对于制服并不那么重要,但尽管如此,它们确实具有Uniform Buffers形式的类似功能。您可以将统一缓冲区绑定到(您选择的)可共享位置,并在所有 GLSL 程序中重用其统一块中的所有值。事实上,这个功能最初是以扩展名的形式引入的:GL_EXT_bindable_uniform
【讨论】: