我记得读过mat4x3占用了更多的寄存器,因为它有四列,而不是mat3x4,即使它们具有相同数量的元素。我似乎无法在任何地方找到它。新规范是否对两种类型的矩阵使用相同数量的统一寄存器?
转置也会影响性能吗?
mat3x4 a; // transposed mat4x3
result = transpose(a) * vec4(val, 1); // keeps order
result = vec4(val, 1) * a; // better performance?
假设(我认为)他们做同样的事情。
答案 0 :(得分:3)
在最新的(4.4)规范文档中,统一限制以组件表示。谈论可以使用MAX_FRAGMENT_UNIFORM_COMPONENTS
查询的其他着色器阶段的glGetIntegerv()
和等效限制:
这些值表示可以在着色器的统一变量存储中保存的单个浮点数,整数或布尔值的数量。
然后,关于矩阵:
矩阵均匀将消耗不超过4×min(r,c)的分量,其中r和c是矩阵中的行数和列数。
因此,对于mat3x4
和mat4x3
,最小维度均为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个属性槽。