问题标签 [vertex-array]

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 回答
1951 浏览

ios - 顶点缓冲区大小的实际大小限制是多少?

在 OpenGL 中,您通常通过使用顶点缓冲区获得更好的性能,甚至通过将许多对象放入同一个顶点缓冲区来获得更好的性能,这样就可以通过一次glDrawArrays调用来绘制大量顶点。

但是,这个的实际上限是多少?同一个缓冲区中有多少 MB 的顶点数据太多了?什么时候应该将一个顶点数组切割成两个单独的顶点数组?你怎么会知道这事?

0 投票
1 回答
1120 浏览

c - 用顶点数组绘制一系列点:没有显示

我正在尝试执行以下操作:有一个点数组,通过一对 GLfloats 表示。用户应该单击窗口中的一个点以显示另一个点。添加一个点时,窗口应为重新绘制后,点应显示为与线相连。因此用户应能够通过单击窗口的某些位置来绘制线。
在这段代码中,只要有点击,我就会在向量中推送一个点,但没有添加这些点,所以我只看到没有点的灰色窗口(在标题中定义的 APPLE_GRAY)。

0 投票
2 回答
4638 浏览

opengl - 为什么 OpenGL 的 glDrawArrays() 在 Core Profile 3.2 下失败并显示 GL_INVALID_OPERATION 而不是 3.3 或 4.2?

我有调用 glDrawArrays 的 OpenGL 渲染代码,当 OpenGL 上下文(自动/隐式获得)4.2 时,它可以完美地工作,但在显式请求的 OpenGL 核心上下文 3.2 时始终失败(GL_INVALID_OPERATION)。(在这两种情况下,着色器总是设置为#version 150,但我怀疑这不是重点。)

根据规范,当 glDrawArrays() 因 GL_INVALID_OPERATION 失败时,只有两种情况:

  • “如果非零缓冲区对象名称绑定到启用的数组并且缓冲区对象的数据存储当前已映射” - 此时我没有进行任何缓冲区映射

  • “如果几何着色器处于活动状态并且模式与 [...] 不兼容”——不,目前还没有几何着色器。

此外:

  1. 我已经验证并仔细检查了它只是 glDrawArrays() 调用失败。还仔细检查了传递给 glDrawArrays() 的所有参数在两个 GL 版本下是否相同,缓冲区绑定也是如此。

  2. 这发生在 3 个不同的 nvidia GPU 和 2 个不同的操作系统(Win7 和 OSX,都是 64 位——当然,在 OSX 中我们只有3.2 上下文,反正没有 4.2)。

  3. 集成的“Intel HD”GPU 不会发生这种情况,但对于那个,我只得到一个自动隐式 3.3 上下文(尝试通过 GLFW 显式强制使用此 GPU 的 3.2 核心配置文件会导致窗口创建失败,但这是一个完全不同的问题...)

对于它的价值,这里是从渲染循环中摘录的相关例程,在 Golang 中:

所以当然这是一个更大的渲染循环的一部分,尽管现在整个“*TMesh”结构只是两个实例,一个是简单的立方体,另一个是简单的金字塔。重要的是,整个绘图循环完美无缺,当查询 GL 以查找 3.3 和 4.2 下的错误时,没有报告任何错误,但在 3 个具有显式 3.2 核心配置文件的 nvidia GPU 上失败,错误代码根据规范仅在两种具体情况,据我所知,没有一种情况适用于此。

这里有什么问题?你遇到过这种情况吗?有什么想法我一直在想念吗?

0 投票
3 回答
2479 浏览

opengl - glGenVertexArrays 没有给出唯一的 vaos

我和我的朋友正在开发一个使用 C++ 和 OpenGL 的项目。我们为“ModelObject”创建了一个 C++ 类,每个 ModelObject 都有一个 GLuint vao 作为成员变量。然后在初始化 ModelObject 时,我们调用

在我们调用的初始化函数结束时

脱离上下文。现在我们正在尝试渲染 2 个对象,一个火车车厢和一个立方体。在他的机器(Linux Mint)上,它们都渲染得很好,有自己的纹理,查询对象的 vaos 分别返回 1 和 2。

然而,在我的机器(MacBook Pro)上,两个对象都呈现为立方体(尽管一个具有火车的纹理,另一个具有立方体的纹理)。查询他们的 vaos 返回 0 和 0。

作为一个实验,我们告诉 glGenVertexArrays 为每个 ModelObject 创建 5 个 vaos。这产生了列表 0、1、918273、8、7(或类似的东西),并且对于两个 ModelObject 来说它是相同的列表。

据我所知,问题在于 glGenVertexArrays 既 a)使用 0 作为有效地址,又 b)在每次调用时生成相同的地址,即使我们从未调用 glDeleteVertexArray。为什么它会在我的机器上而不是他的机器上执行此操作,我该如何阻止它?

0 投票
0 回答
856 浏览

c++ - 使用动态数组和缓冲区对象绘图

创建顶点数组和索引数组时出现问题。我不知道代码的真正问题是什么,但我想是数组类型的问题,有人可以告诉我吗?

编辑:

这里的问题是绘图根本不起作用。但我没有收到任何错误,这只是不显示我想要显示的内容。即使我将制作顶点的代码放入缓冲区中的不同函数中,这也不起作用。我只是尝试这样做:

我将其余的代码显示在程序启动时调用的另一个函数中。但问题依旧

编辑2:

在 glBufferData(GL_ARRAY_BUFFER,sizeof(squareVerts),squareVerts,GL_STATIC_DRAW);

sizeof(squareVerts) 应该是 sizeof(GLfloat)*x,与索引相同。

0 投票
1 回答
307 浏览

objective-c - 难以捕捉 OpenGL 和顶点数组对象的错误

我无法发现这个 OpenGL 实现的错误。当我运行程序时,我唯一得到的是黑屏。我应该看到一个立方体。我没有收到任何错误。我怀疑罪魁祸首可能是 VAO:

0 投票
1 回答
1310 浏览

opengl-es - OpenGL ES 2.0 - 如何批量绘制具有独特平移、旋转、缩放和 alpha 的粒子?

我已将许多粒子的所有顶点数据组合到一个数组中。我如何以保留其独特翻译的方式批量绘制所有这些粒子?

我很困惑如何做到这一点。我已经在这个问题上创建了两个帖子,但仍然感到困惑。我目前正在使用 OpenGL ES 1.1,但如果这意味着我实际上可以通过独特的平移、旋转等完成粒子的批量渲染,我愿意升级到 2.0。

这两个帖子是:

两者都解释了一种高级方法,但我需要知道如何渲染这批粒子,其中每个粒子的平移、旋转和缩放都会改变每一帧。如果您的答案是计算 CPU 上的翻译,那么请举一个例子。

我目前在我的实现中使用顶点数组对象。我知道我应该使用 VBO 以获得最佳性能。我将实现 VBO,但首先我想实现批处理。成功完成批处理后,我会将 VAO 更改为 VBO。因此,这个问题的重点是如何使用 VAO 来实现这一点。

这是我在批处理之前的代码,我将在模型视图矩阵中推送一个新矩阵,根据当前正在渲染的 Actor 进行平移、旋转、缩放和 alpha,并绘制当前正在渲染的 Actor 的顶点和纹理坐标:

现在,鉴于我已将所有粒子 Actor 的顶点和纹理坐标组合到批处理数组中,我想在模型视图矩阵中推送一个新矩阵,并以适当的平移、旋转、比例绘制这些 Actor 的顶点和纹理坐标,阿尔法等。

所以我的猜测是它看起来像:

一个有效的答案是一个代码示例,它清楚地说明了这个问题的解决方案。

0 投票
2 回答
1282 浏览

opengl - 使用顶点数组对象需要什么?

我正在尝试在我的一个程序中使用顶点数组对象,但我的电脑似乎不支持此功能。

当我执行这个函数glewIsSupported("GL_ARB_vertex_array_object")时,它返回 false。

如果我尝试更新我的视频驱动程序,这可以使顶点数组对象可用吗?

如何检查我的显卡支持的 OpenGL?

从 OpenGL 3.0 开始可以使用顶点数组对象吗?

0 投票
1 回答
3270 浏览

ios - 使用 glVertexAttribPointer 在 OpenGL 2.0 中使用着色器绘制模型

我已经基于使用 OpenGLES 2.0 并且还使用着色器的默认模板松散地敲开了面向对象的 iOS 应用程序,但我正在尝试加载一个我曾经调用它的模型:

我之所以使用上面的代码是因为我将我.obj的文件转换为一个可以包含我需要定义的所有数组的文件(参见obj2opengl)。现在,我不是 100%,但我在某个glVertexPointer已弃用的地方读到了,我正在努力让它在我的演示应用程序中工作。目前我正在绘制这个简单的立方体:

立方体!

我取而代之的是使用 OpenGL 着色器代码的模板,使用glVertexAttribPointer的顶点数组略有不同,因为它在同一个数组中包含法线:

我使用此代码绘制立方体(加载着色器文件后):

现在我的问题是,使用 Open GLES 2.0,是否可以在obj2opengl我之前提到的使用glVertexAttribPointer而不是glVertexPointer仍然使用着色器时加载定义的顶点?

以下是其中一个模型文件的一些示例:

0 投票
1 回答
411 浏览

opengl-es - 将深度缓冲区引入使用多个顶点数组对象的渲染器

我有一个渲染基础设施,它使用多个顶点数组对象来渲染一个复杂的场景。每个顶点数组对象负责维护自己的一组绑定缓冲区、指针和属性(正如它们的设计目的)。

给定多个负责渲染的数组对象,如何引入深度缓冲,使每个单独的数组对象在渲染期间使用相同的深度缓冲区?换句话说,我如何统一 Vertex Array Objects(及其良好的封装属性)和深度缓冲的概念,这似乎是一个更全局的概念。

我发现的所有示例都描述了在帧缓冲区的上下文中使用深度缓冲区。苹果在这里描述了这种技术。那么在帧缓冲区级别实现深度缓冲然后让顶点数组对象写入该帧缓冲区的技术是什么?有没有我可以遵循的使用 VAO 和深度缓冲的示例?

我有一个封装顶点数组对象的类,这是它的绑定方法(负责设置各种缓冲区、指针和属性)。

绑定后,draw方法实现如下(这个draw方法在每个单独的顶点缓冲区对象上调用):

所有这一切都很顺利,但我无法看到深度缓冲适合于此。