如何从OpenGL顶点缓冲区对象中的坐标分割值

rsaldnfx  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(139)

为了在OpenGL中绘制热图,我们需要给予每个点的x、y和值。
我们可以用这些值存储一个vbo,并将其拆分为两个vertexattrib指针:

glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 3*sizeof(float), (void*)0);
glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 3*sizeof(float), (void*)sizeof(float));

然而,当更新值时,这只需要写入到xy点之间的值,而xy点是不变的。有没有办法为这些值指定一个单独的数组,这样每个vertexattrib指针就来自不同的源?
@genpfault提出了这样一个解决方案:

glBind(vboPoints);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
glBind(vboVals);
glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 0, (void*)0);

如果这是正确的,那么以这种方式使用的不同vbo的数量是否有限制?
这是否比使用所有值交错的单个内存块更慢?

dphi5xsq

dphi5xsq1#

是否有办法为值指定一个单独的数组,以便每个vertexattrib指针都来自不同的源?
在每次glVertexAttribPointer()调用之前绑定一个不同的VBO。不要忘记适当地调整步幅/偏移量。
除了顶点属性限制(通过glGet*()GL_MAX_VERTEX_ATTRIBS进行查询)之外,对这种方式使用的VBO的数量没有限制
与交错数据相比的性能差异取决于具体实现:没有办法查询GL实现在内部对缓冲区访问进行了什么缓存(如果有的话)。
实际上,您最多只能通过usage参数为glBufferData()给予驱动程序使用提示:
usage是GL实施的一个提示,用于指示如何访问缓冲区对象的数据存储。这使GL实施能够做出可能会显著影响缓冲区对象性能的更明智的决策。但是,它并不限制数据存储的实际使用。
因此,对于您的示例,vboPoints缓冲区可以是GL_STATIC_DRAW,而vboVals最好是GL_DYNAMIC_DRAW

相关问题