OpenGL ES 2.0:glVertexAttribPointer 与 vec3

OpenGL ES 2.0: glVertexAttribPointer vs vec3

我正在尝试用 GL_POINTS 绘制一些点,并让它尽可能快地工作。我有两个变量需要传递给着色器 - 一个位置 (vec2) 以及一个点大小 (float) - 我不确定传递它们的最快方法。

之前我两次使用glVertexAttribPointer,第一次传递位置,第二次传递大小。这让我可以编写如下顶点着色器代码:

attribute mediump vec4 Position;
attribute lowp float Size;

void main(void) {
  gl_PointSize = Size;
  gl_Position = Position;
}

我认为这很好,因为它工作正常并且看起来不错,但后来我在某处读到您应该尽量将 glVertexAttribPointer 调用保持在最低限度。这导致我决定在单个 vec3 中传递位置和大小,这使得我只需要执行一个 glVertexAttribPointer 调用。

但是,这意味着我需要将顶点着色器重写为:

attribute mediump vec3 Position;

void main(void) {
  gl_PointSize = Position.z;
  gl_Position = vec4(Position.x, Position.y, 0.0, 1.0);
}

对我来说这看起来更丑陋,但它使 glVertexAttribPointer 调用更简单。

我的问题是,将它作为 vec3 传递实际上会产生性能差异吗?如果有,我是否有办法重写它以使其看起来不那么难看?我希望做一些像

gl_Position = vec4(vec2(Position));

但这并不令人遗憾。

我试着分析它,它给出了非常相似的结果,但是,它确实给了我一些涉及重叠数据和越界的奇怪错误。我想我会在没有 vec3 的情况下坚持这样做。