Glsl矩阵寄存器?

时间:2014-08-10 08:18:13

标签: opengl glsl

我记得读过mat4x3占用了更多的寄存器,因为它有四列,而不是mat3x4,即使它们具有相同数量的元素。我似乎无法在任何地方找到它。新规范是否对两种类型的矩阵使用相同数量的统一寄存器?

转置也会影响性能吗?

mat3x4 a; // transposed mat4x3

result = transpose(a) * vec4(val, 1); // keeps order
result = vec4(val, 1) * a; // better performance?

假设(我认为)他们做同样的事情。

1 个答案:

答案 0 :(得分:3)

在最新的(4.4)规范文档中,统一限制以组件表示。谈论可以使用MAX_FRAGMENT_UNIFORM_COMPONENTS查询的其他着色器阶段的glGetIntegerv()和等效限制:

  

这些值表示可以在着色器的统一变量存储中保存的单个浮点数,整数或布尔值的数量。

然后,关于矩阵:

  

矩阵均匀将消耗不超过4×min(r,c)的分量,其中r和c是矩阵中的行数和列数。

因此,对于mat3x4mat4x3,最小维度均为3次,因此两者的消耗组件数量均为12。

旧的样式容量查询仍然存在,但定义看起来主要是为了向后兼容而维护:

  

依赖于实现的常量MAX_VERTEX_UNIFORM_VECTORS和MAX_FRAGMENT_UNIFORM_VECTORS的值分别等于MAX_VERTEX_UNIFORM_COMPONENTS和MAX_FRAGMENT_UNIFORM_COMPONENTS的值除以4。

请注意,与制服不同,属性仍然是面向矢量的。根据表11.2,mat3x4消耗了3个属性槽,而mat4x3消耗了4个属性槽。