我正在尝试用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));
但这不会令人遗憾。
答案 0 :(得分:0)
我尝试对其进行分析并得到了非常相似的结果,然而,它确实给了我一些涉及重叠数据和超出界限的奇怪错误。我想如果没有vec3,我会坚持这样做。