【发布时间】:2013-08-14 21:50:18
【问题描述】:
如何有效地更新渲染调用之间的顶点并在其中一些点之间动态渲染线?
我正在研究一个基本的 OpenGL 示例,它是一个静态顶点数组,使用 glDrawArrays 和 GL_TRIANGLES 宏进行渲染。
我想尝试一下动态更新的顶点并在随机点之间绘制基本线。
【问题讨论】:
如何有效地更新渲染调用之间的顶点并在其中一些点之间动态渲染线?
我正在研究一个基本的 OpenGL 示例,它是一个静态顶点数组,使用 glDrawArrays 和 GL_TRIANGLES 宏进行渲染。
我想尝试一下动态更新的顶点并在随机点之间绘制基本线。
【问题讨论】:
您实际上有两个问题,一个与更新顶点数据有关,另一个与绘制缓冲区中包含的顶点子集有关。
在更新顶点缓冲区中的数据时,您不能(或者更确切地说,不应该)更改标记为静态的顶点缓冲区对象中的数据。我假设这就是静态顶点数据的意思? VBO 上的使用标志只是一个提示,但调用 VBO STATIC 是应该告诉驱动程序您将向它发送一次数据并多次绘制。
您的适当标志可以是 STREAM(在提供初始数据后至少更新一次)或 DYNAMIC(经常更新)。
现在,当涉及到实际更改顶点缓冲区对象中的数据时,您有两种选择:
使用 glMapBuffer (...) 将其映射到应用程序的地址空间,并让驱动程序检测您修改了哪些内存区域。
使用glBufferSubData (...)发送连续的数据块。
既然您说要更新缓冲区中的随机位置,最好映射缓冲区而不是对glBufferSubData (...) 进行潜在的数百次调用。
至于在几个顶点之间画线,你要做的是使用索引数组。在现代 OpenGL 中,您将使用相同的机制(即顶点缓冲区对象)将索引存储到顶点缓冲区中。在这种情况下,您使用基元类型 (GL_LINES) 调用 glDrawElements (...),以使用索引数组中的顶点索引、要绘制的第一个索引和索引总数进行构造。
glDrawElements (...) 将从您提供的偏移量开始遍历您的索引数组并绘制 (NumberOfElements / NumberOfElementsPerPrimitiveType) 基元。对于 GL_LINES,每条线由 2 个索引定义(因此,如果您提供 n 个索引,您将绘制 n/2 条线)。
【讨论】: