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