着色器位置vec4或vec3

Ski*_*des 14 opengl performance shader vector glsl

我已经阅读了一些关于GLSL的教程.在某些位置属性是某些vec3中的vec4.我知道矩阵运算需要一个vec4,但是值得发送一个额外的元素吗?发送vec3并稍后在着色器vec4(位置,1.0)中投射是不是更好?内存中的数据越少 - 速度越快?或者我们应该包装一个额外的元素,以避免铸造?

什么提示应该更好?

layout(location = 0) in vec4 position;
MVP*position;
Run Code Online (Sandbox Code Playgroud)

要么

layout(location = 0) in vec3 position;
MVP*vec4(position,1.0);
Run Code Online (Sandbox Code Playgroud)

And*_*man 26

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

也就是说,如果你通过一个3维顶点属性指向一个4维向量,GL将填充在W1.0你.我总是采用这种方法,避免vec4 (...)在对位置进行矩阵乘法时必须明确写入,并且还避免浪费存储第4个组件的内存.

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

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

  • 是的,这就是这意味着什么.如果这样做,每次尝试访问时,GLSL都会为W添加1.0. (3认同)
  • 我觉得可以参考规范的相关部分来改进这个答案。 (3认同)