着色器位置vec4或vec3

时间:2013-09-21 16:58:41

标签: performance opengl vector glsl shader

我已经阅读了一些关于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);

1 个答案:

答案 0 :(得分:24)

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

也就是说,如果将三维顶点属性指针传递给四维向量,GL将为您填充W 1.0。我总是选择这条路线,避免在对位置进行矩阵乘法时显式写vec4 (...),也避免浪费存储第4个组件的内存。

顺便说一下,这也适用于2D坐标。传递给vec4属性的2D坐标变为vec4 (x, y, 0.0, 1.0)。一般规则如下:所有缺失的组件都替换为0.0W除外,1.0替换为{{1}}。

然而,对于那些在这种情况下不了解GLSL行为的人来说,这可能会令人困惑。我想这就是大多数教程从未触及过这个主题的原因。