问题标签 [vbo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1547 浏览

debugging - 调试 VBO 顶点缓冲区崩溃

我正在使用 VBO 扩展来存储顶点、法线和颜色缓冲区 (glBindBufferARB) 出于某种原因,在更改缓冲区或执行某些操作时,应用程序会因访问冲突而崩溃。附加调试器时,我看到崩溃发生在某个线程中,该线程不是我的主线程,该线程执行 opengl 调用,并在与 nvidia 图形驱动程序相关的某个 dll 中执行。

可能发生的事情是我给了一些缓冲区调用错误的缓冲区或大小错误。所以我的问题是,我该如何调试这种情况?崩溃似乎发生在实际调用之后的某个时间并且在不同的线程中。

0 投票
1 回答
1201 浏览

opengl-es - 在 OpenGL ES 1.x 中使用顶点缓冲区对象时可以使用索引图元吗?

我有一个包含顶点列表的数组,我使用顶点缓冲区对象将其复制到 GPU。然而,顶点坐标本身是没有意义的,因为我还有一个整数数组,其中包含顶点数组的索引列表。

在这种情况下,可以创建另一个缓冲区对象来存储索引,然后在渲染函数中绑定顶点数组和索引数组以进行绘图:

我已经阅读了 api 并且以下内容使我感到困惑:
“虽然非零缓冲区对象绑定到 GL_ELEMENT_ARRAY_BUFFER 目标,但 glDrawElements 的索引参数传统上被解释为指向客户端内存的指针,而被解释为内部的偏移量以基本机器单位测量的缓冲对象。”

我对图形编程很陌生,所以如果其中任何一个没有意义,我深表歉意。

0 投票
2 回答
1642 浏览

java - 纹理顶点缓冲区对象

我想做的是用OpenGL绘制一个(大)地形。所以我有一组顶点,比如说 256 x 256,我存储在 VRAM 中的顶点缓冲区对象中。我正确地对它们进行了三角测量,所以我有一个用于面部的索引缓冲区。

我还加载了一个方形纹理,它必须应用于每个三角形。所以我对纹理坐标有疑问:

每个顶点包含在 4 个三角形中,这意味着它需要 4 个纹理坐标。但是 glDrawRangeElements() 需要与顶点一样多的纹理坐标。

所以我不知道如何用 VBO 做到这一点。也许有更好的概念来解决我的问题,或者我只是缺乏一个好主意。

提前致谢。

0 投票
5 回答
18759 浏览

performance - VBO 何时比“简单”的 OpenGL 基元 (glBegin()) 更快?

在多年听说顶点缓冲区对象 (VBO) 之后,我终于决定尝试使用它们(我的东西通常不是性能关键,显然......)

我将在下面描述我的实验,但长话短说,我看到“简单”直接模式(glBegin()/glEnd())、顶点数组(CPU 端)和 VBO(GPU 端)之间的性能无法区分渲染模式。我试图理解为什么会这样,以及在什么条件下我可以期望看到 VBO 显着超过它们的原始(双关语)祖先。

实验详情

对于实验,我生成了一个包含大量点的(静态)3D 高斯云。每个点都有与之关联的顶点和颜色信息。然后我在连续的帧中围绕云旋转相机,形成一种“轨道”行为。同样,这些点是静态的,只有眼睛在移动(通过 gluLookAt())。数据在任何渲染之前生成一次并存储在两个数组中以用于渲染循环。

对于直接渲染,整个数据集在单个 glBegin()/glEnd() 块中渲染,循环包含对 glColor3fv() 和 glVertex3fv() 的单个调用。

对于顶点数组和 VBO 渲染,整个数据集通过一个 glDrawArrays() 调用来渲染。

然后,我只是在一个紧凑的循环中运行它一分钟左右,并使用高性能计时器测量平均 FPS。

性能结果##

如上所述,我的台式机(XP x64、8GB RAM、512 MB Quadro 1700)和笔记本电脑(XP32、4GB 内存、256 MB Quadro NVS 110)的性能无法区分。然而,它确实随着点数的增加而按预期缩放。显然,我也禁用了垂直同步。

笔记本电脑运行的具体结果(使用 GL_POINTS 渲染):

glBegin()/glEnd():

  • 1K 点 --> 603 FPS
  • 10K 点 --> 401 FPS
  • 100K 点 --> 97 FPS
  • 1M 点 --> 14 FPS

顶点数组(CPU 端):

  • 1K 点 --> 603 FPS
  • 10K 点 --> 402 FPS
  • 100K 点 --> 97 FPS
  • 1M 点 --> 14 FPS

顶点缓冲区对象(GPU 端):

  • 1K 点 --> 604 FPS
  • 10K 点 --> 399 FPS
  • 100K 点 --> 95 FPS
  • 1M 点 --> 14 FPS

我用 GL_TRIANGLE_STRIP 渲染了相同的数据并且得到了类似的无法区分(尽管由于额外的光栅化而比预期的要慢)。如果有人想要,我也可以发布这些数字。.

问题)

  • 是什么赋予了?
  • 我必须做什么才能实现 VBO 承诺的性能提升?
  • 我错过了什么?
0 投票
2 回答
14956 浏览

opengl - OpenGL:渲染一批几何图形的有效方法?

这是我一直在研究的东西,但我还没有找到任何具体的信息或好的例子。比如说,我有一堆未连接的对象(例如三角形条带)。渲染这些的有效方法是什么?

我听说将几个对象放在一个 VBO 中以减少 openGL 调用,但还没有看到如何做到这一点的适当示例。我也看到了与这个想法相矛盾的帖子。所以现在,我大多只是困惑。

0 投票
1 回答
3827 浏览

c++ - 使用 OpenGL 的 VBO 的问题

我只是尝试使用 VBO 渲染第一个红皮书示例(白色 Quad)。
它适用于立即模式和顶点数组。

但是当使用 VBO 时,屏幕保持黑色。我想我一定错过了一些重要的事情。

在里面:

VBO 的渲染循环(不工作):

顶点数组的渲染循环(工作):

0 投票
2 回答
2071 浏览

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

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

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

0 投票
3 回答
6801 浏览

c - 如何使用 OpenGL 3.x VBO 渲染动态世界?

尽管 OpenGL 3.x 本身的最新参考资料似乎很少,但 OpenGL 的实际低级操作相对简单。但是,我在尝试将如何操纵 VBO 以呈现动态世界的概念化时遇到了严重的麻烦。

显然,旧的立即模式方式不适用,但我该去哪里呢?我是否编写某种场景结构,然后将其转换为一组顶点并将其流式传输到 VBO,我将如何存储翻译数据?如果是这样,那看起来代码明智吗?

基本上真的不确定如何继续。

0 投票
1 回答
2023 浏览

opengl - 管理 OpenGL VBO 和颜色

我正在创建一个使用 VBO 进行绘图的应用程序。该应用程序绘制多种颜色的线段。因此,我为每种颜色创建了一个顶点和索引数组,并按颜色将这些段排序到适当的数组中。

但是,我希望用户能够设置任何线段的颜色。因此,我的潜在颜色数量几乎是无限的(显然不是,但也可能如此)。我猜想生成 2,000 个 VBO 来保存 1,000 个顶点和索引数组以支持 1,000 种颜色并不是一件好事。

显然,每次绘制新颜色的顶点数组时,可以生成有限数量的 VBO 并复制新数据,但这似乎非常低效。

对处理这种情况有什么建议吗?

0 投票
1 回答
1055 浏览

iphone - 即使更改模型视图矩阵,使用顶点缓冲区对象是否有意义?

我希望在我的 iPhone 应用程序上获得一些额外的性能 (FPS) 提升。我已经在使用交错数据、GL_SHORT 和单个纹理图集。有关我已经完成的操作的详细信息,请参阅此问题。

现在我想看看使用 VBO 来提高性能。根据 Apple 的 OpenGL ES 文档,这是一个很好的步骤。但是,它没有说明 VBO 如何(或是否)受到模型视图矩阵更改的影响。本质上,我将同一个对象多次渲染到场景中,但每次都使用稍微不同的模型视图矩阵。对象之间的主要区别(场景中的位置除外)是纹理映射。它们都有略微不同的纹理坐标。

VBO 会在这种情况下提供帮助吗?我应该为每个单独的对象分配一个单独的 VBO 吗?

更新 1

到目前为止,VBO 似乎对我的表现有负面影响。FPS 回落到 20 年代中期到高 20 年代。我分配了 70 个 VBO:35 个用于数据,35 个用于索引。我可以将数据和一个全局索引数组降低到 35 个。我正在使用 glBufferSubData() 根据需要更新纹理坐标。

另一个想法是分解所有静态数据并为该 VBO 指定 GL_STATIC_DRAW。