OpenGL中的统一位置和统一索引有什么区别?看起来你需要位置来给统一赋值,而你需要索引来查询关于统一的信息。为什么需要两种价值观?为什么其中一种不能同时满足两个目的?
h7appiyu1#
看起来您需要位置来为制服赋值,并且需要索引来查询有关制服的信息。是的,这就是两者的区别。为什么需要两种价值观?不要认为OpenGL API所做的任何事情都是纯粹基于“需要”。有时候只是“我们太愚蠢了”或者“这在某个时候是个好主意,但现在它不再有意义了”。统一地点一般属于后者。最初的想法,可以追溯到3D实验室最初的GLSL建议,是统一的位置可以代表某种字节偏移量。位置是一个有意义的数字,代表统一的内存所在的实际 * 位置 *。因此,该实现不必使用查找表将任意数字转换为制服的实际存储位置的字节偏移量。该位置可以是字节偏移量,或者是从程序对象快速转换到制服数据地址所需的任何其他数据。然而,除了3D实验室自己的GLSL实现之外,实际上从未使用过统一位置。统一位置几乎总是索引的第二种形式,glUniform调用将在表中查找它们。这就是为什么我们现在有了explicitly specify uniform locations的能力。但是他们不能仅仅改变有区别的旧API,所以他们必须保持两种不同的方式来谈论统一。他们并不真的想这样做。在某些方面,保持这种区别使the query APIs更容易使用。可用的统一索引都是从0到某个可查询计数(GL_ACTIVE_UNIFORMS)的索引。一旦你可以显式地指定统一位置,二分法就很有用,因为索引仍然只是一个可查询的数字计数,与位置无关。这样,API就不必有“获取所有可用的统一位置”的查询,只需要查询计数,然后从0到该计数循环查询信息,对用户来说更简单,实现起来也更容易。
glUniform
GL_ACTIVE_UNIFORMS
1条答案
按热度按时间h7appiyu1#
看起来您需要位置来为制服赋值,并且需要索引来查询有关制服的信息。
是的,这就是两者的区别。
为什么需要两种价值观?
不要认为OpenGL API所做的任何事情都是纯粹基于“需要”。有时候只是“我们太愚蠢了”或者“这在某个时候是个好主意,但现在它不再有意义了”。
统一地点一般属于后者。
最初的想法,可以追溯到3D实验室最初的GLSL建议,是统一的位置可以代表某种字节偏移量。位置是一个有意义的数字,代表统一的内存所在的实际 * 位置 *。因此,该实现不必使用查找表将任意数字转换为制服的实际存储位置的字节偏移量。该位置可以是字节偏移量,或者是从程序对象快速转换到制服数据地址所需的任何其他数据。
然而,除了3D实验室自己的GLSL实现之外,实际上从未使用过统一位置。统一位置几乎总是索引的第二种形式,
glUniform
调用将在表中查找它们。这就是为什么我们现在有了explicitly specify uniform locations的能力。但是他们不能仅仅改变有区别的旧API,所以他们必须保持两种不同的方式来谈论统一。
他们并不真的想这样做。在某些方面,保持这种区别使the query APIs更容易使用。可用的统一索引都是从0到某个可查询计数(
GL_ACTIVE_UNIFORMS
)的索引。一旦你可以显式地指定统一位置,二分法就很有用,因为索引仍然只是一个可查询的数字计数,与位置无关。这样,API就不必有“获取所有可用的统一位置”的查询,只需要查询计数,然后从0到该计数循环查询信息,对用户来说更简单,实现起来也更容易。