我已经阅读了一些有关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.0
。
也就是说,如果将3维顶点属性指针传递给4维向量,则GL会为您用W
填充1.0
。我总是遵循这种方法,它避免了在位置上进行矩阵乘法时必须显式地编写vec4 (...)
,并且还避免了浪费存储第4个分量的内存。
顺便说一下,这也适用于2D坐标。传递给vec4
属性的2D坐标变为vec4 (x, y, 0.0, 1.0)
。一般规则是:将所有缺少的组件都用0.0
替换,但W
除外,而1.0
则用替换。
但是,对于在这种情况下不了解GLSL行为的人来说,这可能会造成混淆。我想这就是为什么大多数教程从不涉及这个主题的原因。