18

我已经阅读了一些关于 GLSL 的教程。在某些位置属性是某些 vec3 中的 vec4。我知道矩阵运算需要一个 vec4,但值得发送一个额外的元素吗?发送 vec3 然后在着色器 vec4(position, 1.0) 中投射不是更好吗?内存中的数据更少——它会更快吗?或者我们应该打包一个额外的元素以避免强制转换?

任何提示什么应该更好?

layout(location = 0) in vec4 position;
MVP*position;

或者

layout(location = 0) in vec3 position;
MVP*vec4(position,1.0);
4

1 回答 1

32

对于顶点属性,这无关紧要。1.0第 4 个组件在它不存在时会自动展开。

也就是说,如果你将一个3维的顶点属性指针传递给一个4维的向量,GL会为你W填充1.0。我总是选择这条路线,它避免了vec4 (...)在对位置进行矩阵乘法时必须显式写入,并且还避免了浪费存储第 4 个分量的内存。

顺便说一句,这也适用于 2D 坐标。传递给vec4属性的 2D 坐标变为vec4 (x, y, 0.0, 1.0)。一般规则是这样的:所有缺少的组件都替换为0.0除了W,替换为1.0

但是,对于不了解 GLSL 在这种情况下的行为的人来说,这可能会让人感到困惑。我想这就是为什么大多数教程从不涉及这个话题的原因。

于 2013-09-22T04:47:07.317 回答