问题标签 [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 投票
1 回答
264 浏览

android - android opengl-es中的顶点数组对象

听说最近发布的大部分android设备都支持opengl-es的VAO。我正在尝试在 opengl-es 2.0 环境中开发应用程序。但是,我想知道

(Q1)大多数正在使用的Android设备(可能是几年前生产的)是否支持VAO?如果不是,最好不要使用 VAO,因为我们必须为支持 VAO 和不支持 VAO 的设备编写单独的代码

(Q2)它真的给我们带来了很大的性能优势(与仅使用顶点缓冲区对象(VBO)相比)来使用它们吗?如果是这样,我们如何在 opengl-es2.0 环境中使用它们?

0 投票
1 回答
343 浏览

c++ - 绘制多个立方体时出现 glGenVertexArrays 和 glGenVertexBuffers 的问题

我写了一个小程序,它应该用 OpenGL 4.3 显示几个立方体。我使用 SDL 2.0 创建上下文,但我不认为我的问题来自那里。

我有一个Cube具有多个属性的类,包括GLuint m_vao顶点数组的一个和GLuint m_vbo顶点缓冲区的一个。

为了显示几个立方体,我用不同的坐标创建了这个类的几个实例。我在. glGenVertexArrays(1, &m_vao)_glGenBuffers(1, &m_vbo)Cube

创建这样的多维数据集时我没有问题:

这将创建四个具有唯一属性m_vaom_vbo属性的立方体(1 个用于 c,2 个用于 c2,3 个用于 c3,4 个用于 c4)。

但是,当我像这样创建我的多维数据集时:

my 中的所有立方体vector都具有相同的m_vaom_vbo属性,在这种情况下,它们都具有 1m_vaom_vbo。如果我在手动创建立方体 c、c2、c3 和 c4 后执行此操作,它们都会得到 4。当然,由于它们都使用相同的 VBO,它们都具有相同的坐标,最后只出现了一个立方体。

std::vector所以我的问题是:手动创建多维数据集(工作正常)和在循环中创建它们for(为所有多维数据集生成相同的 VAO 和 VBO)之间有什么不同?

0 投票
0 回答
484 浏览

opengl - 主机内存中的 OpenGL 缓冲区管理和主机设备同步

我想知道如何让我的应用程序与必须进行大量更改的 3D 模型进行交互。例如,我希望能够从应用程序本身自由修改颜色、纹理 ID、位置甚至法线。我认为每次模型更改或每一帧都重新上传模型(glBufferData),但这对我来说似乎是一种内存密集型。

另外,我不太确定我应该如何让一个类访问主机内存中缓冲区的一部分。示例:具有属性并且可以随时修改它们的类“Shape”,修改缓冲区包含的内容。为此,我不知道从哪里开始。我必须指出,我需要在这些类中有更多不能发送到 GPU 的属性。我可以研究的任何提示/技术?

编辑:我在Buffer Object Streaming上找到了这篇文章,并且对使用 glBufferData 和 glBufferSubData 将数据流式传输到 GPU 感到非常舒服。不过,我仍然很难找到一种在缓冲区中定义对象的好方法。

我研究了创建自己的类“SubArray”,其中包含 CPU 内存中的数组、偏移量和长度。它有一个索引器来验证索引并在不在正确范围内时抛出异常,但我觉得使用这种方法不太舒服,因为我无法更改简单对象的块大小(添加顶点)。

0 投票
1 回答
3672 浏览

c++ - 使用顶点缓冲区的直接状态访问

从 2010 年的这个问题来看,关于现代 OpenGL 中的顶点缓冲区,是否仍然存在直接状态访问不可用的情况?我已经修改了我的大部分图形库以使用带有帧缓冲区、纹理等的 DSA,但我仍然需要“绑定”来设置我的顶点数组状态(绑定数组、绑定索引缓冲区、绑定顶点缓冲区、取消绑定数组等)。 )。

更新 1: 我无法从 BDL 的回答中理解参数的作用。我对一个非常简单的顶点缓冲区(一个属性,一个位置)的单元测试给了我一个空白屏幕(它适用于描述顶点流的旧方法)。它应该只绘制一个三角形,不需要索引缓冲区。

这是我正在做的事情,评论是我的理解:

现在,我想我“明白”了绑定点。它们是我可以分配的任意数字,这样我就可以快速轻松地交换一组不同的属性。所以在这个简单的测试中只使用 0 就足够了。

我正在使用 glCreateBuffers 来创建 vbo 和 glCreateVertexArrays 来创建 vao(从以前的可绑定样式更改)。没有调试输出(调试上下文已打开),每个调用都使用 glGetError 检查,并且没有报告错误。

更新 2: glVertexArrayVertexBuffer 步幅和偏移量的顺序错误。现在可以了。

更新 3: glVertexArrayVertexBuffer 被调用一次,而不是为 VBO 中的每个属性调用一次(如果你有交错的位置、纹理等)。

0 投票
1 回答
203 浏览

opengl - Nvidia老驱动,glDrawArrays Exception Access Violation

我们的应用程序在旧的 Nvidia 驱动程序上崩溃..

调试代码在这里

环顾四周,他们说通常是由于顶点属性设置不正确

这就是我设置 vbo 和 vao 的方式:

这就是我渲染的方式:

这是我的VS:

还有我的FS:

我从 2 天开始阅读并重新阅读相同的代码,我找不到任何错误。我还尝试定义 2*4=8 的步幅,但结果相同..

0 投票
1 回答
940 浏览

c++ - OpenGL 大项目、VAO-s 等

所以我一直在https://open.gl/上学习 OpenGL 3.3 ,我对一些东西感到非常困惑。

  1. VAO-s。据我了解,它们用于存储glVertexAttribPointer呼叫。
  2. VBO-s。它们存储顶点。所以如果我用多个对象制作东西,我需要为每个对象一个 VBO 吗?
  3. 着色器程序 - 为什么我们需要多个着色器程序,它们到底是做什么的?
  4. 这条线到底做了什么:glBindFragDataLocation(shaderProgram, 0, "outColor");

最重要的是如何将所有这些融入到一个大项目中?VAO-s 究竟用于什么用途?大多数教程只涵盖了使用硬编码顶点绘制一个或 2 个立方体的内容,那么如何管理具有大量对象的场景呢?我已经阅读了这个线程,并对场景管理是如何发生的有了一些了解,但我仍然不知道如何将 OpenGL 的东西连接到这一切。

0 投票
3 回答
1730 浏览

c++ - 如何正确填充顶点数组

我对如何填充我的顶点数组以正确绘制它感到困惑。我正在使用的 OpenGL 代码是:

希望该图像使这更容易理解。在图像“A”中,左侧的 3x3 矩阵显示了我在绘制三角形时当前得到的结果,右侧的矩阵是我想要实现的。

目前,当我创建要从中绘制的顶点数组时,我按照图像“B”中显示的顺序填充它。当我沿着一行工作时,我将值添加到数组中,然后向下移动一列并重复。例如:

这种输入到 vertexArray 的顺序给出了可以在图像“C”中看到的结果,其中创建了错误的三角形。

我的问题是:填充顶点数组的明智方式是什么,其顺序将在一个大的顶点矩阵上创建三角形,其方式看起来像图像“A”中的右手图。

问题图片

0 投票
2 回答
2180 浏览

opengl - 将多个缓冲区对象与单个顶点数组对象绑定不起作用

我试图了解 OpenGL 顶点缓冲区绑定点和顶点数组索引之间的映射。我有一个二维矩形和一个二维三角形

我将它们放在不同的顶点缓冲区对象中,并尝试将它们映射到顶点数组对象的索引,以便前 3 个属性来自三角形,接下来的 2 个属性来自矩形的最后 2 个点。然后我把它们画成三角形带。

从坐标中可以看出,预期的形状就像一个小屋,在矩形上相邻的三角形。但是,我得到的是这个

展示

我是否误解了顶点数组对象的绑定或索引?完整的可编译代码在这里,我使用 GtkGlExt 但 OpenGL 部分是通用的。

0 投票
2 回答
1600 浏览

c++ - 在 GLSL 中获取旧式 OpenGL 代码

我正在尝试在 OpenGL 中绘制这种模式:

在此处输入图像描述

为此,我创建了如下模式:

我将模式绘制为:

如果我在glBegin()-glEnd()块中创建数据,它的工作速度会更快。但在这两种情况下,我相信更好的方法是在 GLSL 中完成所有工作。我不太了解现代 OpenGL 背后的逻辑。

我试图创建顶点缓冲区数组和颜色数组,但无法正常工作。问题不在于将阵列转移到显卡。我在阵列中得到了堆栈溢出。这是另一个主题的问题,但在这里我想知道是否可以在完全 GLSL 代码(.ver​​t 文件中的代码)中完成此任务,而无需将这些巨大的数组传输到显卡。

0 投票
0 回答
132 浏览

qt - Qt 5.5 和 OpenGL:QVertexArrayObject::create() 调用 QPainter::drawimage()?

我知道要正确初始化和使用任何 Qt OpenGL 便利类,必须使用有效的当前上下文调用它们。因此,我将我的类设计为从我的重载QOpenGLWidget::initializeGL()函数初始化,其中文档说明上下文已创建并成为当前的(尽管没有帧缓冲区)。

但是,当initializeGL()尝试初始化我的一个子类MeshObject,特别是调用函数QOpenGLVertexArrayObject::create()时,程序崩溃并显示消息

Read access violation at 0x0 通过调试器,注意调用堆栈:

在此处输入图像描述

有对 QPainter::drawImage 的调用,这肯定会失败,因为没有帧缓冲区存在。

但是为什么QPainter::drawImage当我尝试创建一个 vertexArrayObject 时会发生调用?当然,这个功能不应该涉及到屏幕上的绘画。

虽然文档还指出 QOpenGLVertexArrayObjects 只能在某些 OpenGL ES 2.0 平台上运行,但vbuffer.create()会导致完全相同的情况发生,而且我已经QOpenGLVertexArrayObjects在之前的项目中使用过这台机器,完全没有问题。

完整的堆栈跟踪: