OpenGL ES 2.0:glVertexAttribPointer vs vec3

时间:2017-03-01 08:22:08

标签: ios opengl-es vertex-shader

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

在我使用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));

但这不会令人遗憾。

1 个答案:

答案 0 :(得分:0)

我尝试对其进行分析并得到了非常相似的结果,然而,它确实给了我一些涉及重叠数据和超出界限的奇怪错误。我想如果没有vec3,我会坚持这样做。