如何使用顶点缓冲区对象渲染许多不同的圆?

时间:2009-09-27 21:49:06

标签: opengl vbo

我正在尝试编写一个涉及多个圈子的游戏(好吧,三角粉丝,但你明白了)。每个圆圈将具有x位置,y位置和质量属性。每个圆圈的质量属性都不同。此外,我想为一些不同的圆圈着色,同时保持透明的圆心,并沿着圆的周边渐渐变为不透明。

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

2 个答案:

答案 0 :(得分:3)

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

(不得与NVIDIA指定的分机buffer textures中的GL_EXT_texture_buffer_object混合使用。)

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

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

但这些'纹理对象'究竟是什么,它们做了什么?好吧,考虑到你实际上可以在每个帧中使用glTexture2D()来设置纹理。纹理对象仅用于减少GPU和主存储器之间的流量;您只发送您知道为静态的纹理对象的“OpenGL名称”(即整数标识符),而不是发送整个像素数组。

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

出于您的目的,维也纳各组织正确答案。你想要许多不断变形和变化的简单物体。简单来说,我指的是顶点小于200的那些。除非您打算编写一个非常智能且复杂的顶点着色器,否则VBO 。您想要使用顶点数组,您可以轻松地从主CPU操作并在每个帧中更新它们,而无需对图形卡进行特殊调用以将整个VBO重新上载到图形卡上(这可能比发送顶点数组更慢)。 / p>

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

答案 1 :(得分:1)

good vbo tutorial

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