我已经阅读了一些关于GLSL的教程。 在某些位置属性是某些vec3中的vec4。 我知道矩阵运算需要一个vec4,但是值得发送一个额外的元素吗? 发送vec3并稍后在着色器vec4(位置,1.0)中投射是不是更好? 内存中的数据越少 - 速度越快?或者我们应该打包一个额外的元素以避免投射?
任何提示哪些更好?
layout(location = 0) in vec4 position;
MVP*position;
或
layout(location = 0) in vec3 position;
MVP*vec4(position,1.0);
答案 0 :(得分:24)
对于顶点属性,这无关紧要。当第四个组件不存在时,它会自动扩展为1.0
。
也就是说,如果将三维顶点属性指针传递给四维向量,GL将为您填充W
1.0
。我总是选择这条路线,避免在对位置进行矩阵乘法时显式写vec4 (...)
,也避免浪费存储第4个组件的内存。
顺便说一下,这也适用于2D坐标。传递给vec4
属性的2D坐标变为vec4 (x, y, 0.0, 1.0)
。一般规则如下:所有缺失的组件都替换为0.0
,W
除外,1.0
替换为{{1}}。
然而,对于那些在这种情况下不了解GLSL行为的人来说,这可能会令人困惑。我想这就是大多数教程从未触及过这个主题的原因。