2

我正在尝试编写一个处理许多圈子的游戏(好吧,三角粉丝,但你明白了)。每个圆都有一个 x 位置、y 位置和一个质量属性。每个圆圈的质量属性都会不同。另外,我想给一些不同的圆圈组上色,同时保持一个透明的圆圈中心,并沿着圆圈的周边褪色到不透明。

我被告知要使用 VBO,并且整天都在谷歌上搜索。我想要一个关于如何绘制这些圆圈的完整示例,以及关于 VBO 如何工作的解释,同时保持解释的简单性。

4

2 回答 2

3

我自己还没有实现 VBO,但据我了解,它们的工作方式类似于纹理对象。事实上,当我提醒自己并向其他人解释 VBO 是什么时,我喜欢错误地将纹理对象称为“纹理缓冲区对象”,以加强概念上的相似性。

(不能与来自 NVIDIA 指定的扩展GL_EXT_texture_buffer_object的缓冲区纹理混合。)

所以让我们想一想:什么是纹理对象?它们是您使用生成的对象glGenTextures()glGenBuffersARB()做类似的事情。类比适用于glBindTexture()glBindBufferARB()

(从 OpenGL 1.5 开始,函数glGenBuffers()glBindBuffer()已进入核心 OpenGL,因此您可以使用它们代替扩展等效项。)

但是这些“纹理对象”到底是什么,它们有什么作用?好吧,考虑一下,实际上,您可以glTexture2D()在每一帧中使用来设置纹理。纹理对象仅用于减少 GPU 和主内存之间的流量;您无需发送整个像素数组,而是仅发送您知道是静态的纹理对象的“OpenGL 名称” (即整数标识符) 。

VBO 也有类似的用途。您无需一遍又一遍地发送顶点数组,而是使用一次上传数组glBufferData(),然后只发送对象的“OpenGL 名称”。它们非常适合静态对象,而不适合动态对象。事实上,许多通用 3D 引擎(如 Ogre3D)为您提供了一种方法来指定网格是动态的还是静态的,很可能是为了让您在 VBO 和顶点数组之间做出决定。

出于您的目的,VBO不是正确的答案。您需要大量不断变形和变化的简单对象。简单来说,我的意思是那些顶点少于 200 个的那些。除非您打算编写一个非常智能且复杂的顶点着色器,否则 VBO适合您。您想使用顶点数组,您可以轻松地从主 CPU 操作并在每帧更新它们,而无需对图形卡进行特殊调用以将整个 VBO 重新上传到图形卡上(这可能比仅发送顶点数组要慢)。

这是来自 nVidia的关于 VBO API的非常好的 letscallit “手册页” 。阅读它以获取更多信息!

于 2009-09-29T20:27:00.747 回答
1

很好的vbo教程

你在做什么看起来像粒子,你可能想谷歌“粒子渲染”以防万一。

于 2009-09-30T07:21:26.993 回答