问题标签 [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 回答
632 浏览

c++ - glGenVertexArrays 在主循环中不创建唯一的 VAO,但在其他情况下工作

我目前正在为我一直在编写的游戏引擎开发一个小型编辑器。我已经使用 Qt 5.6 设置了一个文件菜单,该菜单可以选择添加一个模型,该模型创建一个新模型并将其添加到渲染引擎管理器中。在 Mac OSX 10.11(使用 OpenGL 3 或 4)上,这可以正常工作。在 Ubuntu 16.04 上,它只能稍微起作用。我可以在主循环之外初始化任意数量的模型。但是在主循环内,我只能初始化与在主循环外初始化一样多的模型。当我在 IDE 中启动 gdb 时,问题似乎与 VAO 相关。在 OSX 上,无论我在哪里创建网格,都会为每个模型初始化一个新的 VAO。在 Ubuntu 上,在主循环之外,会为每个网格生成新的 VAO。在主循环内部,所有绘制的网格都具有与之前在主循环外部创建的网格相同的 VAO。

总而言之,在 Ubuntu 中,主循环之外的所有模型都有自己的 VAO。在主循环内,VAO GLuint 句柄再次从 2 开始重新计数。一旦句柄/标签计数超过了在主循环之外初始化的许多模型,模型就会停止绘制。它在 Mac OSX 上运行良好。我怀疑这是一个 OpenGL/Qt 问题,所以即使引擎有很多额外的代码,我认为这个问题是公平的。链接:https ://github.com/BennetLeff/engine

由于有很多文件,我只会包含我认为必要的文件,但我也会链接到 github 项目。对不起,大代码转储,但告诉我是否还有什么我可以提供的。

网格.cpp

主文件

GUIWindow.cpp(继承自 QOpenGLWidget、QOpenGLFunctions)

Model.cpp(不包括仅从 AssImp 获取数据的模型加载)

渲染引擎.cpp

Editor.cpp(减去刚刚设置窗口的大多数 Qt 调用)

0 投票
2 回答
375 浏览

opengl - 如何在一个顶点数组对象中有多个存储布局?

当我说存储布局时,我的意思是我用glVertexAttribPointer. 这个状态是保存在当前绑定的 VAO 还是我绑定的缓冲区中GL_ARRAY_BUFFER

0 投票
1 回答
390 浏览

opengl - 使用实例化数组时如何最小化 glVertexAttribPointer 调用?

我的 OpenGL 代码使用一个 VAO 处理所有模型数据和两个 VBO。第一个用于标准顶点属性,如位置和法线,第二个用于模型矩阵。我正在使用实例绘制,所以我将模型矩阵加载为实例数组(基本上是顶点属性)。

首先,我将标准顶点属性加载到 VBO 并使用glVertexAttribPointer. 然后我将模型矩阵加载到另一个 VBO。现在我必须调用glVertexAttribPointer绘图循环。我能以某种方式防止这种情况吗?

代码如下所示:

我想到了将顶点数据和矩阵存储在一个 VBO 中的方法。那么问题是如何正确设置步幅。我想不出解决办法。

任何帮助将不胜感激。

0 投票
1 回答
2214 浏览

c++ - 我可以有多个 GL_ARRAY_BUFFER 缓冲区吗?

所以我正在查看关于命令 glVertexAttribPointer 的另一个 SO 问题,我遇到了一些困惑。这个问题的公认答案解释说,

但是当您进行调用时,还有一个额外的隐含状态也存储在属性 0 中:数据是从当前绑定到 GL_ARRAY_BUFFER 的缓冲区中读取的

这对我来说很有意义,但是如果我有多个绑定为的缓冲区GL_ARRAY_BUFFER怎么办?该方法如何glVertexAttribPointer()知道要设置哪个属性?

例如,在我的代码中,我正在绘制一个渐变三角形。为此,我创建了 2 个 VBO,一个带有数组中的颜色数据,另一个带有顶点位置。

当我调用命令时,我在哪里指定使用哪个缓冲区?

0 投票
1 回答
181 浏览

c++ - 无法读取传递给顶点着色器的值

我正试图围绕 OpenGL 中各种类型的 GLSL 着色器。目前,我正在为 2d 分层瓷砖实现而苦苦挣扎。由于某种原因,传入我的着色器的 int 值始终为 0(或更可能为 null)。

我目前有一个由 20x20 瓷砖组成的 2048x2048px 2d 纹理。我正在尝试用它来纹理一个四边形,并根据我传递给顶点着色器的整数块来更改图块的索引。

我正在传递一个 vec2 的浮点数作为四边形的位置(实际上是一个 TRIANGLE_STRIP)。我还尝试传入 6 个整数,代表 6 层瓷砖。

我的输入:

我的设置:

我的画法:

我的着色器绝对有效,因为我可以通过对 vertexShader 中的值进行硬编码来调整输出。我的怀疑是我没有正确/以正确的格式传递值,或者没有在某个地方指出每个顶点需要包含 int[6]。

我无法从 int Base[6] 中的布局(位置 = 1)中读取任何内容;我已经尝试了几乎所有我能想到的。分别声明每个 int,尝试读取两个 ivec3、uint 以及我能想到的任何其他内容,但一切都返回 0。

以下是我的顶点和片段着色器的完整性:

分段:

0 投票
1 回答
1840 浏览

c++ - OpenGL中绑定点的目的?

GL_ARRAY_BUFFER我不明白OpenGL中绑定点(例如 )的目的是什么。据我了解glGenBuffers(),它创建了一种指向位于 GPU 内存中某处的顶点缓冲区对象的指针。

所以:

意味着我现在有一个句柄,bufferID,到显卡上的 1 个顶点对象。现在我知道下一步是将 bufferID 绑定到绑定点

这样我就可以使用该绑定点使用如下glBufferData()函数向下发送数据:

但是为什么我不能只使用 bufferID 来指定我想将数据发送到哪里呢?就像是:

然后在调用绘图函数时,我也只需将哪个 ID 放入我希望绘图函数绘制的任何 VBO。就像是:

为什么我们需要额外的间接步骤 with glBindBuffers

0 投票
1 回答
538 浏览

c++ - glDrawElements 在驱动程序中崩溃 | 调试提示

短版:如何调试内部崩溃(坏内存访问异常/nullptr异常)? glDrawElements/glDrawElementsInstanced

长版: 您有一条使用 OpenGL 渲染代码的路径,并通过调用或VAOs提交渲染。该代码路径在大多数情况下都能正常工作。我们正在谈论“编辑器代码”,这意味着:数据可能是任何几何形状,并且很可能会频繁更改。glDrawElementsglDrawElementsInstanced

但有时在提交可重现的数据更改后,它只是在glDrawElements*驱动程序代码内崩溃(即被glDrawElements调用,函数参数正常,崩溃发生在内部glDrawElements)。

你怎么能继续调试这个问题?

PS:

  • 自我回答的问题:所有的研究努力都进入了答案!
  • 这是针对编辑器代码的。对于简单的演示,此类崩溃主要是由于编码人员没有正确理解 glDrawElements 的要求造成的,因此代码路径要么工作要么不工作 - 在这些情况下,请参阅:
0 投票
1 回答
5686 浏览

opengl-es - 如何将 GLSL #version 330 核心转换为 GLSL ES #version 100?

我正在尝试制作一个使用 NDK 和 JNI 在 Android Studio 中绘制图像的应用程序,以使用 OpenGL ES 调用 C++ 代码。我已经阅读了如何在 OpenGL 中执行此操作的教程:https ://learnopengl.com/#!Getting-started/ Textures,它使用 GLSL 330 核心。但是,Android 模拟器不支持 OpenGL ES 3.0(请注意此链接:https ://developer.android.com/ndk/guides/stable_apis.html )。

因此,我必须使用 GLSL ES #version 100 ,它在下面的着色器中不支持“布局”、“输入”和“输出”。我应该如何编辑它们以便它们可以在#version 100 中运行,如果我编辑它们,源代码是否有任何变化?感谢您的关注和帮助。

更新:四处搜索后,我发现我可以使用 glGetAttributeLocation 来获取顶点着色器中变量的位置,而不是使用 layout(location=0)。但是,GLSL ES #version 100 中没有 VAO,所以我仍然无法弄清楚没有 VAO 它是如何工作的。

我的顶点着色器:

片段着色器:

初始化 VAO,VBO,:

绘制图像:

0 投票
1 回答
197 浏览

opengl - 调用 gl.GenVertexArrays 时出现内存错误

我使用 Go 的 go-gl 包已经有一段时间了。在我进行一些重构之前,一切都在 100% 工作,现在我得到了奇怪的错误:

我想知道是否有人有解决方案。我已经更新了我的驱动程序,一个空的 OpenGL 场景可以 100% 工作,而不会生成顶点数组。

这是我的go env

调用函数:

谢谢

0 投票
3 回答
6216 浏览

c++ - glGenVertexArrays 和 glGenBuffers 参数

在有关 OpenGL 3.0+ 的教程中,我们以这种方式创建顶点数组对象和顶点缓冲区对象:

在这里,VAO 是一个unsigned int( GLuint),我们将 a̶ ̶r̶e̶f̶e̶r̶e̶n̶c̶e̶ 它的地址传递给函数glGenVertexArray。但是,根据文档,函数的第二个参数应该是( )的数组。 VBO 和. 我不明白为什么上面的代码适用于这样的论点。unsigned intGLuint*glGenBuffers

我试图用这个替换上面的代码(并在我的代码的其他地方进行必要的修改):

它编译并执行,但我得到了一个意想不到的行为:我的纹理矩形使用第一种语法呈现,而不是第二种语法。我不明白为什么会发生这种情况。

编辑:谢谢。如前所述,第二个代码中存在索引错误。