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

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

有帮助吗?

解决方案

我自己还没有实现 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 的相当不错的 letcallit“手册页” 关于VBO API. 。阅读它以获取更多信息!

其他提示

良好VBO教程

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top