【问题标题】:Why is there no glBindAttribLocation() equivalent for uniform variables?为什么统一变量没有 glBindAttribLocation() 等效项?
【发布时间】:2014-04-15 17:57:34
【问题描述】:

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

【问题讨论】:

    标签: opengl uniform


    【解决方案1】:

    对于初学者来说,除了调用像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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-24
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 2017-11-14
      • 1970-01-01
      • 2016-04-06
      相关资源
      最近更新 更多