使用 glDrawArrays() 时如何获取 VBO 的长度以渲染所有顶点?

Posted

技术标签:

【中文标题】使用 glDrawArrays() 时如何获取 VBO 的长度以渲染所有顶点?【英文标题】:How do I get the length of a VBO to render all vertices when using glDrawArrays()? 【发布时间】:2010-06-03 20:54:01 【问题描述】:

我在函数中创建了一个 VBO,我只想返回 VBO id。

我在另一个函数中使用 glDrawArrays,我希望它绘制 VBO 中的所有顶点,而无需同时传递顶点数。 VBO 还包含纹理坐标数据。

谢谢。

【问题讨论】:

【参考方案1】:

您需要退货,抱歉。有关 VBO 的数据可能位于远离 CPU 且访问速度较慢的地方,因此您需要将所需的任何数据保存在本地。

【讨论】:

好的,谢谢。这是一个问题的原因是因为我将 C++ 和 python 与 ctypes 一起使用。当我尝试使用它来返回所需的两件事时,Ctypes 不喜欢结构。我可以使用全局变量,但这似乎是一个荒谬的解决方案,所以我将再次尝试结构。谢谢你的回答。 你能通过引用传递,从 Python 到 C 吗?这是从函数“返回”数据的另一种方式;它可能会有所帮助。 Ctypes 不介意我使用指针,所以我为一个数组分配了一些内存并将我需要的数据存储在这个数组中。数据都是 GLUint,所以数组是完美的。我使用 new 和 delete 运算符来执行此操作。它现在几乎完全正常工作。至少屏幕不是空白的。 :D 哦,亲爱的。我有内存泄漏。我想我的删除函数没有被调用......【参考方案2】:

也许它对您的应用程序没有用,您可以使用 glGetBufferParameteriv 和参数 GL_BUFFER_SIZE:它返回缓冲区对象的字节数。

很难说这是解决方案,因为您应该知道缓冲区元素的内部格式(实际上,它的大小以字节为单位),以便获得组成缓冲区对象的元素数量。

当然,最好的解决方案是将大部分信息保存在代表缓冲区对象的类中,但我可以从您的问题中理解,这很难实现。

【讨论】:

感谢您的回答。 ;) 我确实设法通过自己存储信息来使其工作。

以上是关于使用 glDrawArrays() 时如何获取 VBO 的长度以渲染所有顶点?的主要内容,如果未能解决你的问题,请参考以下文章

不同形状的OpenGL glDrawArrays

如何使用 glDrawArrays 和 glVertexPointer?

尝试在 C++ 中使用 glDrawArrays 时出错

通过 gldrawarrays 和 GL_POINTS 溺水时得到带有白色边框的点

当有许多重复顶点时,glDrawElements() 是不是比 glDrawArrays() 更有效?

我可以在更新同一个“GL_ARRAY_BUFFER”时多次调用“glDrawArrays”吗?