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