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