问题标签 [vertex-array-object]

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 投票
2 回答
4278 浏览

android - Android顶点数组对象?

我正在编写一些 android 代码,为我计划开发的图形密集型应用程序做准备。自 2004 年以来我没有做过任何 OpenGL。我偶然发现了http://www.opengl.org/wiki/Vertex_Array_Object和 PC 平台的多个来源声称使用 vertex-array-objects 是最好的渲染方式。

我的目标平台是搭载 Android 2.3 的 Motorola Atrix 2 智能手机。

我似乎找不到对应于 GL_OES_vertex_array_object 的函数的包含。我想调用类似于 glGenVertexArraysOES 的函数。

如何在 Android 中使用 VAO?

我目前的包括

0 投票
1 回答
3040 浏览

opengl - 在opengl中将颜色应用于四边形中的单个顶点

我正在尝试为通过绘制的四边形的单个顶点着色glDrawElements,我正在使用cocos2d libray,所以我已经能够清除源代码以准确了解正在发生的事情,代码如下:

所以使用顶点数组对象。我正在尝试修改传递的对象的单个顶点颜色,它似乎可以工作,但存在下图描述的故障:

在此处输入图像描述

这里我尝试改变左下和右下顶点的颜色。结果是不同的,我猜这是因为四边形被渲染为一对共享斜边的三角形,它们位于从左下顶点到右上顶点的对角线上。所以这可能会导致不同的结果。

现在我想对第一个案例也有第二个结果。有没有办法获得它?

0 投票
0 回答
1695 浏览

opengl - OpenGL 4 VBO 和 Numpy 数组、Pyglet/Python 的问题

我开始在 Python 中使用 OpenGL 4(通过 Pyglet 和一些框架代码,我从网上下载/自己编写用于加载着色器/程序),但我认为我对事情的理解相当好,所以我认为没有我的代码中某处有问题。

那么我的问题是什么?似乎当 numpy 数组或缓冲区达到一定大小时,我在绘图时会发生奇怪的事情。请查看链接的图片以了解我的意思。 http://i.imgur.com/8Oym6VA.png?1

在图片上你可以看到我正在画一些“机器人”,每个机器人都是由 8 个盒子组成的。机器人的数据只计算一次,使用基本的立方体顶点/颜色/索引数据,然后适当地平移/缩放/旋转并附加到更大的数组中。在左图中,我在一个 VAO 中绘制了 172 个机器人,右图有 173 个机器人。正如你所看到的,当我检查那个“神奇”的数字时会发生奇怪的事情。看起来好像所有顶点都以某种方式连接到要在屏幕上绘制的第一个点(第一个绘制的机器人“身体”的右上角部分)。如果我将第一个机器人移动到其他地方,所有点仍然连接到该点 - 以说明我确保图片中的点不以 (0,0,0) 或类似的东西为中心。左图有 131328 个浮点数的顶点和颜色数据,索引数据为 49248 长。右图有 132096 个浮点数的顶点和颜色数据,而索引数据为 49536 个浮点数。如果我把数据分成不止一个VAO,那么我可以很容易地画出价值100倍的机器人(当然是100个VAO)没有任何问题(即使是价值1000倍的1000个VAO的机器人也能很好地工作,除了拿了很多内存和大约 0.2 FPS 的工作)。

为了测试 Pyglets 类(或我自己的)是否有任何问题,我还用 OpenGL 调用重写了整个事情,我遇到了同样的问题。那么,VBO 是否根本就没有那么大(我不知何故怀疑 VBO 每个只能有大约 17k 个三角形)?还是它与 Numpy 有关(我以前在 Numpy 中使用过更大的数组,但我不记得有任何问题)?哦,顺便说一句,浮动的大小似乎并不重要(如果所有顶点都在 [-1,1] 范围内,如果上升到 [-35000, 35000],也会发生同样的事情。

我已经广泛搜索了该主题,但在搜索中没有遇到任何类似的东西——如果有,我道歉。当使用非常大的 numpy 数组时,我能找到的只是 MemoryError,但我的数组远不及产生它所需的大小。

我的系统规格是:

  • 英特尔酷睿 i7
  • 英伟达 GeForce GTX 465
  • Windows 8 64 位
  • Python 3.3(64 位)
  • Pyglet 1.2alpha1
  • 用于 Python 3.3 64 位的 Numpy 二进制包,来自这里

虽然我几乎可以肯定我的代码没有任何问题,但我仍然在此处弹出与绘图相关的片段(同样,我也尝试过使用基本 OpenGL 调用,但效果并不好) .

首先,我有一个“处理程序”类,用于存储大量静态数据,因此我可以通过一个 glDraw* 调用(例如游戏关卡或类似内容)来绘制它。它创建了添加数据的方法、初始化其 VBO 和 VAO 的方法以及获取堆栈并在其上绘制的绘制函数。它还获得了它绘制的程序(顶点/颜色着色器)。

我用一些非常简单的代码初始化处理程序,其中 translateMatrix(x, y, z) 返回一个平移矩阵,而 applyTrans(base, trans) 将 trans 应用于 base 中的每个顶点 (x,y,z,w)。

并在 Pyglet Window 的 on_draw 部分调用它

更新:

我发现了问题所在,我现在觉得自己完全愚蠢:P。显然我忘了指定一个numpy数组的dtype,它默认为'int32'。由于我使用 GL_UNSIGNED_SHORT 标志(又名“uint16”)进行绘图,因此它成为了一个问题。我现在确保它尽可能长时间地保持“uint16”(直到索引数据的最大值高于 2^16)并添加了一个检查以查看 indexData 是“uint16”还是“uint32”并添加了适当的glDraw 命令上的标志。

这似乎已经解决了它,因为我现在可以轻松地将几千个(尝试最多 5.000 个)机器人添加到一个 VBO 并且它仍然有效。

不过,我仍然不明白,为什么它看起来像这样(所有顶点都连接到第一个顶点)以及为什么它会在它出现时开始。indexData 正常时的最大值是 32831,开始起作用时的最大值是 33023。所以这两个值明显低于 2^16,为什么 GL_UNSIGNED_SHORT 仍然不起作用?如果有人可以回答这个问题,我将把这个问题留得更久一些,并在几天后/当我得到答案时关闭。谢谢!

0 投票
1 回答
1058 浏览

opengl - Haskell 中的 OpenGL VBO

基于这篇文章,我试图弄清楚如何在 Haskell 中使用 VBO。我试图填写那里没有涵盖的位:

你可以在这里找到完整的代码,以备不时之需。

master 分支上,相同的函数使用普通vertex调用来绘制,Sprites并且它工作得很好。但是使用 VBO,精灵就不存在了。我得到一个空白屏幕。

谁能向我解释我在这里做错了什么?

0 投票
1 回答
3432 浏览

opengl - Vertex Array Objects - 关于保存当前绑定的顶点缓冲区的确切状态信息的混淆

在构建图形引擎的同时,我正在学习arcsynthesis的优秀教程,并发现我并不像我想象的那样了解 VAO。

来自教程第 5 章。深入了解对象

缓冲区绑定和属性关联

您可能会注意到 glBindBuffer(GL_ARRAY_BUFFER) 不在该列表中,即使它是用于渲染的属性设置的一部分。与 GL_ARRAY_BUFFER 的绑定不是 VAO 的一部分,因为在调用 glBindBuffer(GL_ARRAY_BUFFER) 时不会发生缓冲区对象和顶点属性之间的关联。当您调用 glVertexAttribPointer 时,就会发生这种关联。

当您调用 glVertexAttribPointer 时,OpenGL 会获取在此调用时绑定到 GL_ARRAY_BUFFER 的任何缓冲区,并将其与给定的顶点属性相关联。将 GL_ARRAY_BUFFER 绑定视为 glVertexAttribPointer 读取的全局指针。因此,在进行 glVertexAttribPointer 调用后,您可以自由地将任何您想要的内容或任何内容都绑定到 GL_ARRAY_BUFFER;它不会影响最终渲染。所以 VAO 确实存储了哪些缓冲区对象与哪些属性相关联;但他们不存储 GL_ARRAY_BUFFER 绑定本身。

我最初错过了最后一行“......但他们不存储 GL_ARRAY_BUFFER 绑定本身”。在我注意到这一行之前,我认为一旦调用 glVertexAttribPointer 就保存了当前绑定的缓冲区。由于缺少这些知识,我构建了一个网格类,并且能够获得一个具有多个网格正确渲染的场景。

下面列出了该代码的一部分。请注意,我没有在绘图函数中调用 glBindBuffer。

现在我要开始照明了,我想绘制一些调试图,这样我就可以验证我所有的法线是否正确。目前,我只是将要为一个帧渲染的所有行存储在一个向量中。由于这些数据可能会在每一帧都发生变化,因此我使用 GL_DYNAMIC_DRAW 并在渲染之前指定数据。

最初,当我这样做时,我会得到指向无穷远的垃圾线。违规代码如下:

经过一番寻找,以及找到我上面遗漏的细节,我发现如果我在绘制函数中调用 glBufferData 之前调用 glBindBuffer,一切正常。

考虑到这一点,我对为什么我的网格渲染首先起作用感到困惑。如果我更改缓冲区中的数据,是否只需要再次调用 glBindBuffer ?或者如果您不绑定缓冲区并且我只是不走运并且让它工作,那么行为是否未定义?

请注意,我的目标是 OpenGL 3.0 版。

0 投票
1 回答
2461 浏览

shader - JOGL,带有着色器、VAO 和索引数组的简单示例

我正在尝试在 Java (JOGL) 中移植一个简单​​的 C++ 示例。

但它不起作用,它一定是愚蠢的,但我看不到它..

我试图尽可能地减少它(最初它使用更多的顶点和另一个 VAO)。glsl程序使用了一个我经常使用的外部类,应该没问题。好的也应该是来自另一个示例的顶点和片段着色器。如果错误看起来不在这里,我也会粘贴其余的。我没有收到任何错误,只是一个空白屏幕..如果我注释掉 display() 中的行,我可以看到三角形..

任何想法?

0 投票
0 回答
1692 浏览

performance - 显示列表与 VAO 性能

我最近在我的渲染引擎中实现了功能,使其能够根据运行时设置将模型编译为显示列表或 VAO,以便我可以将两者相互比较。

我通常更喜欢使用 VAO,因为我可以让多个 VAO 共享实际的顶点数据缓冲区(而且因为它们没有被弃用),但我发现它们实际上比我的 nVidia (GTX 560) 硬件上的显示列表更差. (无论如何,我想继续支持显示列表以支持较旧的硬件/驱动程序,因此保留处理它们的代码并没有真正的损失。)

差别不大但肯定是可以衡量的。例如,在引擎状态的某个点上,我可以使用 VAO 持续测量我的绘图循环,以相当一致的平均值,大约 10.0 毫秒来完成一个循环,我可以切换到显示列表并观察循环时间减少在同样一致的平均值上约为 9.1 毫秒。这里的一致意味着一个周期的偏差通常小于±0.2 ms,远小于差异。

这些设置之间唯一改变的是普通网格的绘制代码。它从 OpenGL 调用看起来简单的 VAO 代码改变......

...到显示列表代码,如下所示:

当然,这两种代码路径也适用于各种模型的其他状态,但是以完全相同的方式发生,所以这些应该是唯一的区别。我已经明确确保不要在绘图调用之间不必要地解除绑定 VAO,因为结果也证明它的表现要差得多。

这种行为是可以预期的吗?我曾预计 VAO 的表现会更好,或者至少在显示列表方面表现相同,因为它们更现代且不会被弃用。另一方面,我一直在网上阅读到 nVidia 的实现对显示列表等进行了特别优化,所以我认为他们的 VAO 实现可能仍然落后。有没有其他人得到与我的匹配(或矛盾)的发现?

否则,我会做错什么吗?是否有任何已知情况使 VAO 在 nVidia 硬件或一般情况下的性能比应有的差?

作为参考,我在 Intel HD Graphics (Ironlake) 上也尝试了相同的差异,结果发现使用 VAO 的性能与直接从内存中直接渲染一样好,而显示列表比两者都差得多。我希望我有 AMD 硬件可以尝试,但我没有。

0 投票
1 回答
2064 浏览

c++ - 将任意数量值的顶点数组传递给 GLSL 顶点着色器

我需要一种将数组传递给每个顶点包含多个值的顶点着色器的方法。我有这个:

  • 一组 3d 点
  • 每个点的一组 3d 法线
  • 一组面(所有三角形)
  • 每个顶点的所有邻域法线的一个数组。如果顶点 i 有 4 个邻居,则该数组具有顶点的 4 个 3d 法线(4 个邻居中的每一个的法线)。为简单起见,我创建了这个数组,就好像所有顶点都具有相同数量的邻居(模型中的最大值,下一个示例中为 4)。

所以,结构如下:

  • 点数组 = v0 v1 v2 v3 v4 ...
  • 法线数组 = n0 n1 n2 n3 n4 ...
  • 面数组 = [0 1 2] [0 3 1] [0 4 3] ...
  • 邻域法线数组 = [n1 n2 n3 n4] [n0 n2 n3 0] [n0 n1 0 0] [n0 n1 n4 0] [n0 n4 0 0] [n0 n3 0 0] ...

在示例中,最大邻域为 4,因此对于那些没有 4 个邻居的人,我使用 0 向量(0.0、0.0、0.0)填充所有正常数据。在一般情况下,每个顶点有超过 4 个邻居。在当前模型中,我有一些具有 14 个邻居的顶点,因此每个顶点需要 14 个法线或 42 个浮点数)。

在 VS 的标题中,我有:

但我不知道在 XXX 中使用什么来告诉着色器数据不是 vec3、vec4、mat4 等,而是(编译时已知大小)vec3 的数组。


编辑:也许使用 VAO 不是通往 NeighborsNormals 的方法。我愿意接受建议,但我需要知道当前顶点的特定索引才能访问正确的值。


这样做的目的是计算顶点周围区域的曲率,以便使用镶嵌着色器进行镶嵌。特别是,我希望复制这项工作: http: //perso.telecom-paristech.fr/~boubek/papers/VDTess/

我正在使用 C++ 和 OpenGL 4.0,但我可以升级到 OpenGL 4.3。我来自 OpenGL 2.0 的中级知识,但 GLSL(旧的或现代的)对我来说是新的(大约几个月)。

提前致谢。

0 投票
1 回答
523 浏览

ios - OpenGL ES 顶点数组对象和奇怪的伪影

我正在渲染一个必须在方向发生变化时重建的场景,以便适当地填充屏幕。场景渲染了一些常规彩色四边形的顶点数组对象和一组纹理顶点数组对象。所有这些绘图元素,包括任何着色器和相关的顶点、索引等数组都包含在一个类中,所以我每次都会吹走这个类并在旋转时执行一个新的 alloc/init。

首次创建场景时,一切看起来都很好。然而,由于某种原因并且没有明显的模式,奇怪的三角形可能会出现在任何后续的旋转中。对于特定场景,每次加载时的发生似乎都是确定性的。然而,从一个场景到另一个场景,有时会出现文物,有时一切看起来都很可爱。

我不知道这是否是我破坏记忆的方式(即使在 ARC 中,我也需要释放其中的一些),还是我创建 VAO 的方式。然而,由于问题仅在我拆除场景并重建它时才会出现......然后我开始用这个思考过程再次旋转我的轮子。

我有很多代码,所以这里有一些(希望是)相关代码。

这是彩色四边形 VAO 的一些绘图代码。我正在向 NSMutableArray 添加顶点,因为我不知道会有多少个四边形。

为纹理四边形创建 VAO 的一些代码:

我的拆解代码:

在过去的几天里,我在网上搜索并尝试了我能想到的一切来找出这个问题,它开始变得非常糟糕。任何想法将不胜感激!

更新:我发现了问题!

正如我所怀疑的那样,我花了这么多天试图找到的东西非常微不足道 - 在所有错误的地方!

罪魁祸首是这一行:

在我注意到这个混乱的计算并立即将其更改为:

即我改为计数到实际指数计数。

0 投票
2 回答
742 浏览

opengl - 交错顶点数组对象不显示颜色

我正在尝试为每个顶点渲染一堆具有自己颜色的顶点。顶点的数量大约是 1 mio,所以我使用顶点数组对象来渲染它们。渲染点对我来说没有问题,但是当我将颜色添加到数据数组时,点仍然呈现为白色。我尝试了找到的不同教程,但它们都对我不起作用(例如:tut1tut2this)。

我将数据放在一个带有 VCVCVC 的数组中... 3 个浮点数用于顶点位置,4 个浮点数用于颜色。

我是 OpenGL 的新手,所以我可能犯了一个我看不到的愚蠢错误。

顺便说一句:即使使用数组中的颜色,顶点位置仍然正确