动态渲染顶点之间的线条OpenGL
Posted
技术标签:
【中文标题】动态渲染顶点之间的线条OpenGL【英文标题】:Dynamically render lines between vertices OpenGL 【发布时间】:2013-08-14 21:50:18 【问题描述】:如何有效地更新渲染调用之间的顶点并在其中一些点之间动态渲染线?
我正在研究一个基本的 OpenGL 示例,它是一个静态顶点数组,使用 glDrawArrays
和 GL_TRIANGLES
宏进行渲染。
我想尝试一下动态更新的顶点并在随机点之间绘制基本线。
【问题讨论】:
【参考方案1】:您实际上有两个问题,一个与更新顶点数据有关,另一个与绘制缓冲区中包含的顶点子集有关。
在更新顶点缓冲区中的数据时,您不能(或者更确切地说,不应该)更改标记为静态的顶点缓冲区对象中的数据。我假设这就是静态顶点数据的意思? VBO 上的使用标志只是一个提示,但调用 VBO STATIC 是应该告诉驱动程序您将向它发送一次数据并多次绘制。
您的适当标志可以是 STREAM(在提供初始数据后至少更新一次)或 DYNAMIC(经常更新)。
现在,当涉及到实际更改顶点缓冲区对象中的数据时,您有两种选择:
使用 glMapBuffer (...)
将其映射到应用程序的地址空间,并让驱动程序检测您修改了哪些内存区域。
使用glBufferSubData (...)
发送连续的数据块。
既然您说要更新缓冲区中的随机位置,最好映射缓冲区而不是对glBufferSubData (...)
进行潜在的数百次调用。
至于在几个顶点之间画线,你要做的是使用索引数组。在现代 OpenGL 中,您将使用相同的机制(即顶点缓冲区对象)将索引存储到顶点缓冲区中。在这种情况下,您使用基元类型 (GL_LINES) 调用 glDrawElements (...)
,以使用索引数组中的顶点索引、要绘制的第一个索引和索引总数进行构造。
glDrawElements (...)
将从您提供的偏移量开始遍历您的索引数组并绘制 (NumberOfElements / NumberOfElementsPerPrimitiveType) 基元。对于 GL_LINES,每条线由 2 个索引定义(因此,如果您提供 n 个索引,您将绘制 n/2 条线)。
【讨论】:
如何在数组中特定索引处的顶点之间画线?例如第一次回调,在索引 2 和 9 之间画一条线,第二次渲染,在索引 6 和 1 之间画一条线等。 实际上没有任何回调。您只是告诉 OpenGL 在构建图元(在这种情况下为线)时要使用哪些顶点(通过它们的索引)。有 LOOP 模式(每个顶点连接到下一个,最后一个连接回第一个)和 STRIP/FAN 模式(共享顶点/边以减少您必须通过的索引数量)。使用普通的 GL_LINES,元素数组中的每 2 个索引定义一个唯一的行。 元素数组的美妙之处在于,顶点着色器只需变换一次唯一的顶点,即使它们被单个索引列表中的 20 或 30 个不同的图元使用。这一切都是为了有效地重用数据。 谢谢。我正在考虑更多关于 GLPOINTS 之间的渲染线。例如。 3d 空间中的 50 个点,我想在它们之间随机渲染线,我看不出这与顶点数组的关系以及绘制随机线的特定调用在哪里完成。 如果您按索引选择 50 个随机点并将它们放入元素数组中,则可以在一次绘制调用中完成。以上是关于动态渲染顶点之间的线条OpenGL的主要内容,如果未能解决你的问题,请参考以下文章