【发布时间】:2013-04-30 22:51:10
【问题描述】:
OpenGL中统一位置和统一索引有什么区别?似乎您需要位置来为制服分配值,并且您需要索引来查询有关制服的信息。
为什么需要两个值?为什么其中一个不能同时实现这两个目的?
【问题讨论】:
标签: opengl
OpenGL中统一位置和统一索引有什么区别?似乎您需要位置来为制服分配值,并且您需要索引来查询有关制服的信息。
为什么需要两个值?为什么其中一个不能同时实现这两个目的?
【问题讨论】:
标签: opengl
您似乎需要位置来为制服分配值,并且您需要索引来查询有关制服的信息。
是的,这就是两者的区别。
为什么需要两个值?
不要假设 OpenGL API 所做的任何事情都纯粹基于“需要”。有时只是“我们很愚蠢”或“这曾经是个好主意,但现在它不再有意义了。”
统一位置一般属于后者。
回到 3D Labs 最初的 GLSL 提案,最初的想法是统一位置可以表示某种字节偏移。该位置是一个有意义的数字,表示制服记忆所在的实际位置。因此,实现不必使用查找表将任意数字转换为实际内存所在的字节偏移量。该位置将是字节偏移或任何其他需要的数据。
但是,除了可能 3D Labs 自己的 GLSL 实现之外,它从未被实际使用过。统一位置几乎总是只是索引的第二种形式,glUniform 调用会在表格中查找它们。
这就是我们现在能够explicitly specify uniform locations 的原因。这基本上是 ARB 的说法,“我们放弃了;它们现在是指数”。但他们不能只改变有区别的旧 API,所以他们必须保持两种不同的方式来谈论制服。
他们并不是真的想要。在某些方面,保持区别使the query APIs 更易于使用。可用的统一索引是从 0 到某个可查询计数 (GL_ACTIVE_UNIFORMS) 的所有索引。一旦您可以明确指定统一的位置,二分法就变得有用了,因为索引仍然只是与位置无关的可查询数字计数。
这样,API 不必有“获取所有可用的统一位置”查询。您只需查询计数,然后从 0 到该计数进行循环以查询信息。对用户来说更容易,实现也更容易。
【讨论】: