问题标签 [vao]

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 投票
0 回答
105 浏览

ios - 释放 IBO 和 VAO 时的 EXC_BAD_ACCESS

我在 iOS 中制作了一个小游戏,每当加载新模型时,都会在舞台上创建 VBO、IBO 和 VAO。当不再需要模型时,这些缓冲区将被释放。

缓冲区的创建和销毁总是在渲染循环开始时完成(我有一个线程,在游戏循环中跳帧)。

我以前只使用 VBO 和 VAO,它以前从未崩溃过,但是当我添加索引缓冲区对象 IBO 时,我突然开始遇到这些崩溃。

如果我不释放缓冲区,它不会崩溃,所以我猜模型仍在渲染中并且擦除缓冲区会导致它崩溃?但是,如果我只有一个线程,那怎么可能呢?顺便说一句,不过,我不会删除数据。所有的顶点和索引都是静态的。

这是我释放缓冲区的代码,当特定模型没有引用时调用该代码:

0 投票
1 回答
514 浏览

opengl-es - 仅在 Nexus 4 设备上出现 VAO 错误

当我使用顶点数组对象时,我在使用 OpenGL ES2 的 nexus 4 上遇到了一个奇怪的错误。

以下是一些信息:

  • 当我不使用 VAO 时一切正常
  • 一切都可以在其他设备和 Ipad 2 上使用和不使用 VAO
  • glGetError() 没有返回错误
  • 由于错误,游戏中出现了一些故障(某些元素出现了另一种现象)
  • 我的 VBO 是动态的(我用 glBufferData 更新它们)

这是错误:

Adreno-ES20(16818): : validate_vertex_attrib_state: 在绘图调用中没有启用顶点属性!

这是我的代码:

这是我使用它的方式:

0 投票
1 回答
504 浏览

c++ - C++/OpenGL - VAO 问题

在了解了 VBO 之后,一位朋友告诉我尝试使用 VAO 将立方体索引与顶点链接起来。我遵循了几乎所有我能找到的教程,但无济于事。看起来缓冲区绑定正确,一切正常,直到我尝试绘制它们。

这就是我生成 VAO 的方式 -

渲染 -

0 投票
2 回答
21741 浏览

opengl - 顶点数组对象和顶点缓冲区对象的使用

我试图了解这两者,如何使用它们以及它们之间的关系。假设我想创建一个简单的地形和一个带纹理的立方体。对于这两个对象,我都有三角形顶点数组,对于立方体,我有一个包含纹理数据的数组。我的问题是:如何使用 VAO 和 VBO 来创建和渲染这两个?

  1. 我是否必须为每个对象创建一个 VAO 和 VBO?
  2. 还是应该为每个对象的 VBO(顶点、纹理数据等)创建一个 VAO?

有很多教程和书籍,但我仍然不明白如何理解和使用这些概念。

0 投票
1 回答
1080 浏览

opengl - QOpenGLVertexArrayObject 导致多个 VBO 的段错误?

我正在尝试在 Qt 5 中使用实例化渲染,但遇到了一些麻烦。我想我的问题可以追溯到我对 VAO 的使用。我是一位经验丰富的程序员,知道这些问题几乎总是我的错,但我偶尔会遇到 Qt 错误,所以我想在提交错误报告之前我可以使用一些帮助。

我整理了一个简单的例子,它不使用实例化(出于某种原因,我无法请求最新版本的 OpenGL,即使我在我正在开发的“真实”软件中没有这个问题) .

在初始化时,我创建了一个 VAO 和两个 VBO。一个 VBO 填充了一些数据,并保持绑定;另一个已分配,但已释放(我从未真正使用它:我计划最终将矩阵写入它以进行实例化,但没有走得那么远)。

我添加了一些预处理器指令来简化打开或关闭 VAO 或第二个 VBO 的使用。如果我同时使用 VAO 和 VBO,则会出现分段错误。如果我摆脱了第二个 VBO 或 VAO,则没有 seg 错误并且绘图看起来正确(它应该是在彩色三角形后面绘制的白色三角形)。

这是代码:

glbuffertest.cpp:

glbuffertest.cpp:

glwindow.cpp:

glwindow.h:

谁能发现我在做什么愚蠢的事情?

0 投票
1 回答
875 浏览

opengl - 对OpenGL VBO分配的简单好奇

我使用 OpenGL 和 GLSL 编写了一个简单的图形引擎。直到这里,当我需要创建一个新的网格场景节点时,我为每个网格创建了一个 VAO、一个 VBO 和一个 IBO。我以这种方式为每个网格加载了顶点属性:

但是如果场景是由很多网格组成的,那么它的性能就不正确(太多的状态变化)。所以,我决定为我场景的所有几何体创建一个独特的 VAO、VBO 和 IBO(单例类)。

执行此操作的方法如下:

为每个网格加载特定类(我们称之为“VertexAttributes”)中的所有顶点属性。加载所有网格后,我们可以在唯一的 VBO 中分配大顶点缓冲区。所以像上面一样,我首先调用函数“glBufferData”来分配整个内存,其中包含场景中所有顶点属性的大小,然后在循环中为每种顶点属性调用函数“glBufferSubData”。

但是是否可以多次调用 glBufferData(对于每个网格)并在场景加载期间填充 VBO(对于每个网格逐步)。所以它看起来像一个realloc。是否可以使用 OpenGL 来做到这一点,或者我的第一种方法是好的?

0 投票
2 回答
8150 浏览

qt - 如何在 Qt 5 中使用带有实例化的 VAO

0 投票
0 回答
638 浏览

opengl - 使用 OpenGL 渲染具有独特 VAO/VBO/IBO 的场景

我编写了一个运行良好的 OpenGL 应用程序,我只想提高它的性能。当然,这样做的一个好方法是将多个网格打包在一个唯一的 VBO 中(当然要注意顶点的数量)。所以我不是在谈论巨大的场景,而是在我的例子中是一个只有 2 个网格(一个平面和一个立方体)的简单场景。这是我的场景的快速概述:

在此处输入图像描述

现在这里是这 2 个独立网格的一些统计数据(以字节为单位):

目前,我的 2 个网格包含在一个唯一的 VBO 中(当然我有一个唯一的 IBO,其中包含两个网格的索引)。这是我采用的将所有数据存储在单个数组中的模式:

这是一个很好的方法,但它迫使程序员(当然属于我:) 也许它是错误的)为每个网格声明一个特定的 VAO,因为要渲染我的 2 个网格的几何形状,我必须更改缓冲区偏移量以发送数据到着色器程序。

平面网格数据的发送:

发送立方体网格的数据:

正如您使用这种方法所看到的,我需要知道每个网格的 3 个偏移量。因此它意味着 2 个 VAO(每个网格一个)。是真的吗?(我想确保用这种方法不可能用独特的 VAO 绘制这两个网格 - 提前感谢这一点)。

PS:要渲染几何图形,我使用函数 glDrawRangeElements。所以在这个例子中,这个函数在一个循环中被调用了 2 次,当然元素范围不同:

现在我提出另一种方法,这次使用独特的 VAO 来渲染所有几何图形。这是新模式:

正如您所看到的这种解决方案,我只需要 3 个偏移量(0、360 和 600)来渲染所有几何图形(当然,IBO 将与前一种方法不同,并将相应地构建)。所以在这里我需要一个独特的 VAO !但这次我需要了解所有场景(所有顶点)才能构建我的 VBO(填充一次),这与之前的情况不同,我可以多次填充我的 VBO 网格。你同意我吗 ?

另一个问题:如果我想移除例如立方体,我无法移除 VBO。那么这里的方法是什么?我是否需要将我的“Mesh”类的布尔值“m_IsVisible”设置为 false?(我的网格将不再可见,但顶点不会是空闲的!)或者我需要释放顶点吗?我怎样才能做到这一点 ?

你觉得我的提议怎么样?哪一个是最好的 ?

在我的示例中是否可以使用独特的 VAO?

0 投票
1 回答
394 浏览

opengl - “批处理”一词在 3D 计算机科学(3D 引擎)中的确切含义是什么?

我正在使用 OpenGL 开发 3D 应用程序。

我对以下帖子的一部分有误解:OpenGL VAO 最佳实践

我不确定这篇文章中“批处理”一词的含义。

这是否意味着场景的每个对象?那么是否建议为场景的每个对象或多个对象创建一个 VAO?批次是指几个对象共享相同的材质、变换和着色吗?

0 投票
2 回答
419 浏览

groovy - 为什么我的 OpenGL “hello world”没有渲染?

为此,我已经把头撞在墙上两天了。我正在尝试提取最简单的 OpenGL Core ~2.0-3.2 绘图序列,以便我可以从中构建代码并真正理解 API。我遇到的问题是,这些教程似乎从来没有为他们正在使用的 OpenGL 版本提供有用的标签,而我在文档中碰巧遇到了关于如何从我的上下文中请求特定版本的文档,这完全是幸运的。

我确定我现在启用了 3.2 核心,因为即时模式绘图会引发错误(这是一件好事!我想留下即时模式!),我试图去掉任何花哨的东西,比如坐标变换或三角形绕组这可能会搞砸我的显示器。问题是,我无法让任何东西出现在屏幕上。

在该程序的先前迭代中,有时我确实设法在屏幕上使用随机坐标获得了一个白色三角形,但在我看来,顶点设置不正确,并且奇怪的位组合会产生奇怪的结果。符号在三角形出现的位置无关紧要 - 因此我的理论是顶点信息没有正确地传输到顶点着色器,或者着色器正在破坏它。问题是,我正在检查我能找到的所有结果和日志,并且着色器可以很好地编译和链接。

我将在下面提供链接和代码,但除了我想知道的只是在屏幕上显示三角形之外,我是否可以让着色器程序将文本和/或诊断值吐出到它的 shaderInfoLog 中?这将极大地简化调试过程。

我正在咨询的各种教程是......

http://arcsynthesis.org/gltut/Basics/Tutorial%2001.html http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Introduction https://en.wikipedia.org/wiki/Vertex_Buffer_Object http://www .opengl.org/wiki/Tutorial2:_VAOs,_VBOs,_Vertex_and_Fragment_Shaders_(C_/_SDL) http://antongerdelan.net/opengl/hellotriangle.html http://lwjgl.org/wiki/index.php?title=The_Quad_with_DrawArrays http ://lwjgl.org/wiki/index.php?title=Using_Vertex_Buffer_Objects_(VBO) http://www.opengl.org/wiki/Vertex_Rendering

http://www.opengl.org/wiki/Layout_Qualifier_(GLSL)(在提供的代码中不存在,但我尝试的是#version 420,布局限定符为0(in_Position)和1(in_Color))

代码(LWJGL + Groovy)

这并不重要,但该卡是支持 GL4 的 ATI Radeon HD 8550G(A8 APU 的一部分)。

我会根据要求更新更多信息,我只是不知道还有什么可能有助于诊断。

编辑:我更新了上面的代码以反映 Reto Koradi 建议的更改。我还有一个使用备用顶点声明运行的代码变体:

这确实会在屏幕上产生光栅化的东西,但这根本不是我所期望的。它不是简单地重新定位右下角(右上角?)点,而是在什么都没有、完全白色和以下两种形状之间翻转:

奇怪的形状 1 奇怪的形状 2

如果我替换第二个或第三个顶点,就会发生这种情况。如果我替换第一个顶点,屏幕上不会出现任何内容。因此,为了检查我关于哪个顶点实际出现在窗口中心的假设,我尝试了以下操作:

很简单,对吧?中间的顶点可能应该是第一个“红色”顶点,因为它是非可选顶点,没有它我似乎无法在屏幕上绘制任何东西。实际上并非如此。半屏块总是像预期的那样是红色的,但是朝左的三角形总是我替换的任何顶点的颜色——替换第二个顶点使其变为绿色,替换第三个顶点使其变为蓝色。看起来“-0.8,-0.8”和“0.8,-0.8”都离屏幕太远了,可见的三角形部分实际上是一条无限细的线。但我不认为这是由于变换 - 这更像是一个对齐问题,其任意阈值约为 0.9,将坐标发射到远地。

为了继续深入研究,我增加了硬编码 GLSL 的数量以完全忽略缓冲区 -

这会产生所需的结果,一个漂亮的大三角形,每个顶点都有不同的颜色。显然,我想从顶点缓冲区中取出同一个三角形,但这是一个非常好的开始 - 有两个顶点,我至少可以判断最终顶点射向的方向。对于第一个顶点,它肯定是down

我还想出了如何在配置文件中启用调试模式,它向我吐出颜色缓冲区错误。好的!这是一个开始。现在为什么不抛出大量的 VBO 错误?